Автоматическое сохранение базовых данных и постоянный NSManagedObjectID и дочерний ManagedObjectContext - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть следующий простой вариант использования:

  • A NSTableView, где пользователь может добавлять новые записи. Объект Entry создается в Базовых данных и предварительно заполняется вычисленными значениями.
  • Когда пользователь дважды щелкает строку, он открывает подробный вид с возможностью для пользователя редактировать поля поля. Entry объект.
  • Пользователь может затем нажать Сохранить или Отменить, чтобы сохранить / отменить изменения.

Для реализации изменений Отмена / Отмена я использую дочерний элемент NSManagedObjectContextв подробном представлении (которое получает объект Entry перед отображением). Код:

// Create child MOC
self.managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
self.managedObjectContext.parent = self.parentManagedObjectContext

guard let entryInChildContext = try? self.managedObjectContext.existingObject(with: self.entry.objectID) as? Entry else {
        // Display error message
}
// Switch to the new context
self.entry = entryInChildContext

ПРОБЛЕМА

objectID может быть временным, если вновь созданный Entry еще не был сохранен в постоянном хранилище. В этом случае запись не может быть найдена в дочернем MOC.

ЧТО Я ПОПЫТАЛ, НО НЕ РАБОТАЛ

  • Сохранение (вызов save ())основной ManagedObjectContext: вызывает проблемы с автоматическим сохранением (NSPersistentDocument.autoSavesInPlace возвращает true). Подробнее здесь .
  • Вызов managedObjectContext.obtainPermanentIDs(for: [newEntry]), но это вызывает ту же проблему, как описано в предыдущем пункте. Вызов его на дочернем MOC также не работает.

Итак, как в таком случае я могу работать с дочерним managedObjectContext? Я действительно хочу иметь постоянный идентификатор объекта, потому что у объекта Entry нет собственного уникального поля.

Заранее спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...