Обработка миграции в coredata в рамках с использованием групп приложений? - PullRequest
0 голосов
/ 18 мая 2018

У меня есть 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.Спасибо!

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