Модель, используемая для открытия магазина, несовместима с моделью, используемой для создания магазина. - PullRequest
179 голосов
/ 16 января 2012

Я создал модель базовых данных в xcode 3.2, а после обновления в Xcode 4.2 я добавил новую сущность подкласса NSManagedObject (см. Новую сущность).

Во-первых, это выглядит странно, потому что он не в той же группе, что и старая. Вот изображение на моем xcode 4.2 (AlkitabDB - это то, что я создал в xcode 3.2, EndeDB - новое из текущей версии xcode (4.2):

the new entity do not grouped in xdatamodel

Во-вторых, я оставил все как есть, затем я получил доступ ко второй сущности (новой) так же, как и к первой сущности (старой), и появляется ошибка с названием.

Вот ошибка:

2012-01-16 21:13:38.496 iHuria[55953:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x8829cd0 {metadata=<CFBasicHash 0x882a370 [0x1839b38]>{type = immutable dict, count = 7,
entries =>
    2 : <CFString 0x8829b90 [0x1839b38]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x8829ff0 [0x1839b38]>{type = immutable, count = 0, values = ()}
    4 : <CFString 0x8829bc0 [0x1839b38]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x8829770 [0x1839b38]>{value = +320, type = kCFNumberSInt64Type}
    6 : <CFString 0x8829bf0 [0x1839b38]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x882a080 [0x1839b38]>{type = immutable dict, count = 1,
entries =>
    0 : <CFString 0x882a010 [0x1839b38]>{contents = "AlkitabDB"} = <CFData 0x882a030 [0x1839b38]>{length = 32, capacity = 32, bytes = 0xd02ac5f8be6ab0b39add450aca202ac0 ... 3d45d462998d2ccd}
}

    7 : <CFString 0x10e3aa8 [0x1839b38]>{contents = "NSStoreUUID"} = <CFString 0x8829e60 [0x1839b38]>{contents = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59"}
    8 : <CFString 0x10e3948 [0x1839b38]>{contents = "NSStoreType"} = <CFString 0x10e3958 [0x1839b38]>{contents = "SQLite"}
    9 : <CFString 0x8829c40 [0x1839b38]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x6b1c7c0 [0x1839b38]>{value = +3, type = kCFNumberSInt32Type}
    10 : <CFString 0x8829c70 [0x1839b38]>{contents = "_NSAutoVacuumLevel"} = <CFString 0x882a0c0 [0x1839b38]>{contents = "2"}
}
, reason=The model used to open the store is incompatible with the one used to create the store}, {
    metadata =     {
        NSPersistenceFrameworkVersion = 320;
        NSStoreModelVersionHashes =         {
            AlkitabDB = <d02ac5f8 be6ab0b3 9add450a ca202ac0 ebd1e860 cbb578c2 3d45d462 998d2ccd>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
        );
        NSStoreType = SQLite;
        NSStoreUUID = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "The model used to open the store is incompatible with the one used to create the store";
}

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

Ответы [ 25 ]

6 голосов
/ 19 августа 2014

Пожалуйста, удалите приложение из симулятора, очистите код и запустите. Это нормально работает. Может быть, это поможет вам.

6 голосов
/ 12 ноября 2012

Я только что удалил [Simulator App Folder]/Document/*.sqlite файл после внесения изменений в сущности, и это сработало. И, конечно же, файл .sqlite содержит все сохраненные данные и структуры, которые будут потеряны.

6 голосов
/ 27 февраля 2015

Если вы используете Swift.

Следуйте ответу @Stas и вставьте параметры вместо nil в ваш делегат приложения:

let myOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
            NSInferMappingModelAutomaticallyOption: true]
        if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: myOptions, error: &error) == nil {
5 голосов
/ 15 декабря 2012

Попробуйте «Сбросить содержимое и настройки» в симуляторе.Сработало у меня после удаления приложения и Чистой сборки

4 голосов
/ 24 мая 2014

У меня возникла та же проблема с моим приложением (еще не выпущенным в App Store).

Вот как я это исправил:

  1. Run Clean (Cmd + Shift + K)
  2. Перезапустите iOS Simulator
  3. iOS Simulator -> Сбросить содержимое и настройки (из панели навигации)

(3) был шагом, который наконец заставил его работать должным образом.Надеюсь, это поможет!

2 голосов
/ 24 апреля 2013

Если вы вносите изменения в модель базовых данных, вы должны предоставить политику миграции, которая сообщает базовым данным, как адаптировать существующие постоянные объекты (созданные пользователями с текущей выпущенной версией) к новой модели.

Для некоторых сценариев Core Data может автоматически выводить отображение из старой модели в новую.Для более сложных изменений вам может потребоваться реализовать некоторую логику, которая выполняет миграцию.

Подробности можно найти в Руководстве по программированию управления версиями и переносом данных базовой модели .

Обновление
Этот ответ здесь о переполнении стека охватывает основы облегченной миграции Core Data, а также содержит некоторый код для начала работы.

2 голосов
/ 24 апреля 2013

Вам нужно будет перенести модель основных данных с помощью миграции. Каждый раз, когда вы меняете модель, вы делаете ее несовместимой без контроля версий. Пристегнитесь, это немного волосатая тема.

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/CoreDataVersioning/Articles/Introduction.html

2 голосов
/ 10 апреля 2013

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

Если это так, вам нужно позаботиться о переносе старых данных в новую схему:

Управление версиями базовой модели данных и миграция данных

1 голос
/ 16 января 2012

Во-первых, в пакете xcdatamodeld должны присутствовать только файлы xcdatamodel.Ваши подклассы должны НЕ быть в xcdatamodeld.Переместите их оттуда.Есть большая вероятность, что они сбивают с толку компилятор.

Во-вторых, ошибка указывает, что Core Data не может найти вашу модель.Вы создали данные и затем коснулись модели?Если это так, вы находитесь в несогласованном состоянии и должны исправить это, либо удалив данные (что предложил Филипп), либо изменив модель BACK .

1 голос
/ 19 июля 2013

Эта проблема обычно возникает из-за несовместимости между версией, в которой была создана БД .Общий подход к этой проблеме - удалить приложение и переустановить его.Но в упомянутом вами случае версия БД полностью отличается на Xcode 3.2 и 4.2.Так что лучше используйте ту же версию Xcode для БД.

...