Как поделиться Core Data с несколькими приложениями (а не только с расширением) с помощью групп приложений и избежать повреждения хранилищ Core Data?

Я сделал приложение для iOS 8, которое использует новую функцию групп приложений для совместного использования хранилища Core Data с расширением. Это сработало так хорошо, что я подумал, что попробую его с двумя отдельными приложениями, совместно использующими хранилище Core Data в контейнере группы приложений. Но пока это работало между приложением и расширением, у меня возникают проблемы с повреждением хранилища основных данных при совместном использовании с двумя приложениями.

В зависимости от порядка, в котором я открываю 2 приложения, я получаю разные ошибки:

Выборки вызывают эту ошибку:

CoreData: error: (522) Ошибка ввода-вывода для базы данных в /private/var/mobile/Containers/Shared/AppGroup/[………………………………………………………………………………………………………………………………………………………………………………………… Код ошибки SQLite: 522, "не ошибка"

Сохранения вызывают эту ошибку:

CoreData: error: (11) Неустранимая ошибка. База данных в /private/var/mobile/Containers/Shared/AppGroup/[...ght.sqlite повреждена. Код ошибки SQLite: 11, "образ диска базы данных искажен"

Or:

Основные данные: ошибка: -executeRequest: обнаружено исключение = ошибка во время выполнения SQL: ПЕРВИЧНЫЙ КЛЮЧ должен быть уникальным с userInfo = {NSFilePath = "/private/var/mobile/Containers/Shared/AppGroup/[...ght.sqlite"; NSSQLiteErrorDomain = 19; } CoreData: ошибка: (19) ПЕРВИЧНЫЙ КЛЮЧ должен быть уникальным.


person Richard Venable    schedule 18.02.2015    source источник
comment
Было бы интересно узнать это самому (если это вообще возможно). Вам определенно придется реализовать некоторую систему управления версиями, чтобы, если база данных обновляется одним приложением, любые другие приложения, которые обращаются к базе данных, не подключались, пока они не поймут эту версию базы данных.   -  person Robotic Cat    schedule 18.02.2015
comment
@RoboticCat, да, я думал об этой проблеме с версией. Но так как я даже не могу заставить их работать над одной версией, у меня проблемы :)   -  person Richard Venable    schedule 18.02.2015
comment
Вы это решили? Имея ту же проблему.   -  person Claes    schedule 07.10.2015


Ответы (1)


Вот как я это сделал, создав фреймворк для хранения / управления базой данных

  1. Добавьте одну и ту же запись в права групп приложений в каждом из ваших приложений.
  2. Используйте его для создания вашего databaseURL, используя:

    [NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:

  3. база данных = [ [UIManagedDocument alloc] initWithFileURL: databaseURL]

  4. [database saveToFileURL: database.fileURL forSaveOperation: UIDocumentSaveForCreating completionHandler: ^(BOOL success)
  5. В случае успеха инициализируйте persistentContainer.
  6. А теперь самое сложное ... managedObjectModel должен быть определен фреймворком. Этого не может быть ни в одном из приложений. Они могут это видеть, но это должно быть частью пакета фреймворка. Это основная схема и многое другое, но с этим вы сможете добраться до нее. Повеселись!
person Clint Shank    schedule 03.05.2018