2010-05-23 5 views
1

Я пишу приложение на основе документа Coredata (например, CoreData + NSPersistentDocument): при создании нового документа инициализируется новый стековый стека с моделью и одним управляемым контекстом ,CoreData: слияние двух контекстов перед сохранением документа

Прежде чем пользователь сохраняет документ, что мне нужно сделать, это: - создать новый контекст - создать много новых управляемых объектов в нем - слияние двух контекстов.

Я выдаю save: в новом контексте, но он вызывает исключение «Этот NSPersistentStoreCoordinator не имеет постоянных хранилищ. Он не может выполнять операцию сохранения».

Как я могу это сделать? Должен ли я сохранить документ перед этой операцией?

Кстати, если я сохраню документ, создаю новый контекст, импортирую данные и сохраняю новый контекст и, наконец, сохраняю контекст документа, получаю следующее сообщение: «Файл этого документа был изменен другим приложением, поскольку вы открыли или сохранили его. "; есть идеи?

С уважением!

ответ

0

Основная проблема заключается в том, что NSPersistentDocument выполняет атомное сохранение, в результате чего документы NSManagedObjectConext сохраняются во временном файле, а затем этот файл обменивается атомом с файлом по URL-адресу документа (если он существует). Сроки этого свопа не являются общедоступными, поэтому почти невозможно для подкласса NSPersistentDocument знать URL-адрес (временного) постоянного хранилища во время операции сохранения. Я считаю, что ваш единственный вариант - переопределить -[NSPersistentDocument writeToURL:ofType:forSaveOperation:originalContentsURL:error:], чтобы вы могли сохранить новый контекст после создания постоянного хранилища.

Для справки, я зарегистрировал эту ошибку с помощью Apple по адресу rdar: // 6510616 (пожалуйста, не стесняйтесь дублировать ее, чтобы проголосовать за исправление).

+0

Спасибо за ваш ответ, Барри. Мне удалось добавить постоянное хранилище в памяти при инициализации документа, так что различные NSManagedObjectContext удастся сэкономить; в writeToURL: ofType: forSaveOperation: originalContentsURL: ошибка: я переношу этот магазин в sqlite, если это первое сохранение. – unixo

Смежные вопросы