У меня есть Cocoa Touch Framework, в котором у меня есть все мои модели и другие объекты, связанные со стеком coredata.Стек инициализирует файл sqlite в расположение в общей группе приложений.Несколько приложений собираются совместно использовать эти модели и постоянное хранилище (следовательно, необходимо поместить модели в каркас и использовать общую группу приложений для хранения файла sqlite).
Это прекрасно работает, разделяя данные между двумя приложениямидо тех пор, пока не потребуется обновление инфраструктуры, вызывающее миграцию к объектам, связанным с coredata, поскольку я не могу гарантировать, что оба приложения будут обновлены на устройстве с новой версией платформы одновременно.Код для обоих приложений все еще действителен и по-прежнему работает нормально (приложение A с платформой V1, приложение B с платформой V2), но база данных sqlite будет изменена в результате миграции из обновления приложения B.
Возможно ли этоиметь эту работу с coredata?Я могу заставить его работать с sqlite с использованием FMDB или аналогичного (если обновления схемы БД являются исключительно аддитивными), но хотел бы получить удобство coredata.Проблема coredata может быть проиллюстрирована следующим образом:
- Приложение A установлено с Framework V1 и запущено, coredata создает БД в группе приложений
- Приложение B установлено с Framework V1 &запустить, не нужно создавать БД, просто использует его из группы приложений
- Приложение B обновлено с помощью Framework V2 и выполняется, миграция на БД для добавления столбцов / переименования столбцов, все хорошо
- Приложение A запускается снова (все еще с Framework V1), отменяет то, что только что сделало Приложение B (удаляет добавленные столбцы, удаляет данные из столбцов, которые были переименованы и переименовываются назад)
- Поскольку оба приложения выполняются в обоих направлениях, Схема БД продолжает идти вперед и назад (из-за миграций, я думаю ??) и данные теряются
Возможно ли то, что я пытаюсь сделать с помощью coredata, или мне следует продолжить работу с FMDB или подобным?
С помощью FMDB я могу вручную управлять БД (создавать / изменять таблицы) и приводить их в свои модели, чтобы я мог добавлять / исключать столбцы при преобразовании в мои модели, чтобы один и тот же источник данных могиспользовать для обоих.
Некоторый код ниже, чтобы помочь (это работает при условии, что все приложения работают на одной и той же версии фреймворка):
let groupID = "group.com.company.sharedgroup"
let bundleID = "com.company.framework"
let modelName = "Model"
lazy var diskStoreDescription: NSPersistentStoreDescription = {
let groupContainer = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: groupID)!
let sqliteURL = groupContainer.appendingPathComponent(modelName).appendingPathExtension("sqlite")
return NSPersistentStoreDescription(url: sqliteURL)
}()
lazy var managedObjectModel: NSManagedObjectModel = {
let bundle = Bundle(identifier: bundleID)!
let momdURL = bundle.url(forResource: modelName, withExtension: "momd")!
return NSManagedObjectModel(contentsOf: momdURL)!
}()
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: modelName, managedObjectModel: managedObjectModel)
container.persistentStoreDescriptions = [diskStoreDescription]
container.loadPersistentStores {}
return container
}()
Основные данные волшебны и делают таблицу ZOBJECT
с столбцами Z_PK
, Z_ENT
, Z_OPT
, ZNAME
//Model V1
class Object: NSManagedObject {
@NSManaged var name: String
}
Базовые данные делают магию и обновляют таблицу ZOBJECT
с столбцами ZTITLE
//Model V2
class Object: NSManagedObject {
@NSManaged var name: String
@NSManaged var title: String?
}
Запуск приложения A (с моделью V1) после приложения B (с моделью V2) удаляет столбец ZTITLE
, но не вызывает исключений или ошибок.Затем при повторном запуске приложения B (с моделью V2) воссоздается ZTITLE
.Я хотел бы, чтобы приложение А продолжало нормально функционировать и просто игнорировать ZTITLE
.Ответы могут варьироваться от this is how you should do this...
до coredata is not meant to support this, use FMDB
.Спасибо!