Модель, используемая для открытия магазина, несовместима с той, которая используется для создания магазина
Я создал модель Core Data в 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";
}
Я искал решение раньше и обнаружил, что я должен удалить приложение из симулятора и повторно запустить приложение, и это не сработало.
Кто-нибудь знает решение этой проблемы?
Пожалуйста, помогите.
Ответы
Ответ 1
Удалите приложение из симулятора и выполните очистку вашего проекта. Это должно устранить эти проблемы. Убедитесь, что вы не работаете в отладчике при удалении приложения, иначе он фактически не удалит его правильно.
Если вы хотите убедиться, что он ушел, проверьте этот каталог Users/INSERT_YOUR_USER_HERE/Library/Application Support/iPhone Simulator/
для своей папки приложения в той версии, в которой вы работаете.
Примечание. Это только для разработки. Для производства вам необходимо выполнить некоторую миграцию. Google "Core Data Migration", при этом легкая миграция является самой простой.
Ответ 2
Удаление приложения иногда не так! Предложите, ваше приложение уже опубликовано! Вы не можете просто добавить новый объект в базу данных и продолжить - вам нужно выполнить миграцию!
Для тех, кто не хочет копаться в документации и ищет быстрое решение:
- Откройте файл .xcdatamodeld
- нажмите на редактор
- выберите Добавить версию модели...
- Добавьте новую версию вашей модели (добавлена новая группа моделей данных)
- выберите основной файл, откройте инспектор файлов (правая панель)
- и в разделе
Versioned core data model
выберите новую версию модели данных для текущей модели данных. - ЭТО НЕ ВСЕ) Вы должны выполнить так называемую "легкую миграцию".
- Перейдите в ваш
AppDelegate
и найдите, где создается persistentStoreCoordinator
- Найдите эту строку,
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
- Замените
nil
параметры на @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES}
(фактически предоставляется в закомментированном коде в этом методе) - Вот, пожалуйста, веселитесь!
PS Это касается только облегченной миграции. Чтобы ваша миграция квалифицировалась как легкая миграция, ваши изменения должны быть ограничены этой узкой полосой:
- Добавить или удалить свойство (атрибут или отношение).
- Сделать необязательное свойство необязательным.
- Сделайте необязательный атрибут необязательным, если вы укажете значение по умолчанию.
- Добавить или удалить объект.
- Переименовать собственность.
- Переименуйте объект.
Для Swift 4
coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])
Ответ 3
Просто добавьте атрибут Параметры при создании файла persistentStoreCoordinator в файле AppDelegate.m для основного метода данных, как показано ниже
OBJECTIVE-C
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil)
{
return _persistentStoreCoordinator;
}
NSLog(@"persistentStoreCoordinator___");
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite"];
NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
NSLog(@"persistentStoreCoordinator___2");
return _persistentStoreCoordinator;
}
СВИФТ
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
// The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
// Create the coordinator and store
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
var failureReason = "There was an error creating or loading the application saved data."
// MAIN LINE OF CODE TO ADD
let mOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
NSInferMappingModelAutomaticallyOption: true]
do {
try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: mOptions)
} catch {
// Report any error we got.
var dict = [String: AnyObject]()
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application saved data"
dict[NSLocalizedFailureReasonErrorKey] = failureReason
dict[NSUnderlyingErrorKey] = error as NSError
let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
// Replace this with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
abort()
}
return coordinator
}
Он решил мою проблему.
Ответ 4
Ответ: Удалите приложение из симулятора, выполните очистку и повторите сборку проекта.
Примечание.. Когда вы выполняете изменения в определении основных данных, удалите приложение, установленное на физическом устройстве или симуляторе, снова очистите проект и снова постройте.
Ответ 5
Да. После удаления приложения на физическом устройстве и его восстановления он работает.
Ответ 6
Для быстрого доступа в AppDelegate.swift найдите строку
try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: nil )
и замените его на
try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])
Ответ 7
Я просто провел несколько дней, борясь с этой ошибкой, а также слиял с модамиModelFromBundles и получил сообщение "Невозможно объединить модели с двумя разными объектами с именем *".
Оказывается, проблема с корнем в том, что Xcode не удаляет старые ресурсы с устройств, и у меня были старые версии моей модели данных (файлы .mom), которые вызывали конфликты. Вот почему удаление приложения устраняет проблему на одном из моих устройств.
После нахождения этого сообщения в блоге через другой ответ SO я сделал свое приложение более терпимым к старым моделям, изменив эту строку, которая ищет ВСЕ. файлы мамы:
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
который отображается только в каталоге Filters:
NSString *path = [[NSBundle mainBundle] pathForResource:@"Filters" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];
Я использовал recursivePathsForResourcesOfType из this this question: чтобы понять это, зарегистрировав все файлы .mom в приложении:
NSArray *momPaths = [self recursivePathsForResourcesOfType:@"mom" inDirectory:[[NSBundle mainBundle] resourcePath]];
NSLog(@"All .mom files:%@",momPaths);
Я также использовал iExplorer, чтобы посмотреть на посторонние файлы .mom(я еще не пытался их удалить).
Метод, приведенный ниже, также был полезен. Он показал, что объект находится в объединенной модели, возвращенной [psc managedObjectModel], которая больше не существовала ни в моей модели, ни в самом магазине. Именно это позволило мне поверить, что старая модель кэшировалась на самом устройстве, которое чистое здание не удаляло. Метод регистрирует каждый объект, который является одним и тем же, был изменен или добавлен в модель или удален из нее. (написано с помощью этого SO-ответа в качестве отправной точки):
- (BOOL)comparePersistentStore:(NSPersistentStoreCoordinator *)psc withStoreURL: (NSURL *)storeURL {
NSError *error = nil;
// Get the entities & keys from the persistent store coordinator
NSManagedObjectModel *pscModel = [psc managedObjectModel];
NSDictionary *pscEntities = [pscModel entitiesByName];
NSSet *pscKeys = [NSSet setWithArray:[pscEntities allKeys]];
//NSLog(@"psc model:%@", pscModel);
//NSLog(@"psc keys:%@", pscKeys);
NSLog(@"psc contains %d entities", [pscModel.entities count]);
// Get the entity hashes from the storeURL
NSDictionary *storeMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType
URL:storeURL
error:&error];
NSDictionary *storeHashes = [storeMetadata objectForKey:@"NSStoreModelVersionHashes"];
//NSLog(@"store metadata:%@", sourceMetadata);
NSLog(@"store URL:%@", storeURL);
NSLog(@"store NSStoreUUID:%@", [storeMetadata objectForKey:@"NSStoreUUID"]);
NSLog(@"store NSStoreType:%@", [storeMetadata objectForKey:@"NSStoreType"]);
NSSet *storeKeys = [NSSet setWithArray:[storeHashes allKeys]];
// Determine store entities that were added, removed, and in common (to/with psc)
NSMutableSet *addedEntities = [NSMutableSet setWithSet:pscKeys];
NSMutableSet *removedEntities = [NSMutableSet setWithSet:storeKeys];
NSMutableSet *commonEntities = [NSMutableSet setWithSet:pscKeys];
NSMutableSet *changedEntities = [NSMutableSet new];
[addedEntities minusSet:storeKeys];
[removedEntities minusSet:pscKeys];
[commonEntities minusSet:removedEntities];
[commonEntities minusSet:addedEntities];
// Determine entities that have changed (with different hashes)
[commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
NSData *storeHash = [storeHashes objectForKey:key];
NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
if ( ! [pscDescrip.versionHash isEqualToData:storeHash]) {
if (storeHash != nil && pscDescrip.versionHash != nil) {
[changedEntities addObject:key];
}
}
}];
// Remove changed entities from common list
[commonEntities minusSet:changedEntities];
if ([commonEntities count] > 0) {
NSLog(@"Common entities:");
[commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
NSData *storeHash = [storeHashes objectForKey:key];
NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
}];
}
if ([changedEntities count] > 0) {
NSLog(@"Changed entities:");
[changedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
NSData *storeHash = [storeHashes objectForKey:key];
NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
NSLog(@"\tpsc %@:\t%@", key, pscDescrip.versionHash);
NSLog(@"\tstore %@:\t%@", key, storeHash);
}];
}
if ([addedEntities count] > 0) {
NSLog(@"Added entities to psc model (not in store):");
[addedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
}];
}
if ([removedEntities count] > 0) {
NSLog(@"Removed entities from psc model (exist in store):");
[removedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
NSData *storeHash = [storeHashes objectForKey:key];
NSLog(@"\t%@:\t%@", key, storeHash);
}];
}
BOOL pscCompatibile = [pscModel isConfiguration:nil compatibleWithStoreMetadata:storeMetadata];
NSLog(@"Migration needed? %@", [email protected]"no":@"yes");
return pscCompatibile;
}
use: вызывается перед добавлением каждого хранилища в NSPersistentStoreCoordinator:
[self comparePersistentStore:self.psc withStoreURL:self.iCloudStoreURL];
_iCloudStore = [self.psc addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:self.iCloudStoreURL
options:options
error:&localError];
Ответ 8
Каждый раз, когда вы вносите изменения в определение базовой даты, вы должны удалить приложения, установленные на физическом устройстве или симуляторе.
Ответ 9
- Остановить запуск приложения.
- Удалить приложение на симуляторе.
-
Product
→ Clean
- Сборка, запуск.
Ответ 10
Самое простое решение, которое работало для меня в Swift 2.1, Xcode 7:
-
Удалите приложение из симулятора (Cmd + Shift + H, чтобы перейти на главный экран. Длинные нажмите приложение, нажмите "Крест", просто обычным способом удаления приложения с вашего телефона)
-
Cmd + Shift + H снова остановить танцы приложений
-
Вернитесь к своему проекту и снова запустите
У меня была эта проблема при записи/чтении из Core Data с двумя созданными объектами. При удалении приложения и повторной попытке программы исправлена проблема
Ответ 11
Я только что удалил файл [Simulator App Folder]/Document/*.sqlite
после внесения изменений в сущности, и он сработал.
И, конечно, файл .sqlite содержит все сохраненные данные и структуры, которые будут потеряны.
Ответ 12
Пожалуйста, удалите приложение с симулятора и очистите код и запустите .it работают нормально. Возможно, это поможет вам.
Ответ 13
Если вы используете Swift.
Следуйте за ответом @Stas и вставьте опции вместо nil в свой делегат приложения:
let myOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
NSInferMappingModelAutomaticallyOption: true]
if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: myOptions, error: &error) == nil {
Ответ 14
Попробуйте "Reset Содержание и настройки" в симуляторе. Работала для меня после удаления приложения и Clean build
Ответ 15
У меня возникла такая же проблема с моим приложением (еще не выпущенным в App Store).
Вот как я его исправил:
- Run Clean (Cmd + Shift + K)
- Перезагрузите iOS Simulator
- iOS Simulator → Reset Содержимое и настройки (из навигационной панели)
(3) был шагом, который, наконец, заставил его работать должным образом. Надеюсь, это поможет!
Ответ 16
Хотя иногда вы можете просто удалить приложение с устройства при изменении схемы в модели управляемого объекта, в некоторых сценариях это невозможно, например. потому что вы уже опубликовали свое приложение со старой схемой.
Если это так, вам нужно позаботиться о переносе старых данных в новую схему:
Управление версиями модели данных и переноса данных
Ответ 17
Вам потребуется перенести модель Core Data с помощью миграции. Каждый раз, когда вы меняете модель, вы делаете ее несовместимой без версий. Прикрепите себя, это немного волосатая тема.
http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/CoreDataVersioning/Articles/Introduction.html
Ответ 18
Если вы вносите изменения в свою модель Core Data, вы должны предоставить политику миграции, которая сообщает Core Data, как использовать существующие сохраняемые объекты (которые ваши пользователи создали с выпущенной в настоящее время версией) для новой модели.
Для некоторых сценариев Core Data может автоматически выводить сопоставление от старой модели к новой. Для более сложных изменений вам может потребоваться реализовать некоторую логику, которая выполняет миграцию.
Подробности можно найти в Руководство по программированию версий и преобразования данных в Core Data Model.
Обновление
Этот ответ здесь о переполнении стека описывает основы легкой миграции данных Core Data, а также имеет некоторый код для запуска.
Ответ 19
Во-первых, единственное, что должно быть в пакете xcdatamodeld
, это xcdatamodel
файлы. Ваши подклассы должны НЕ находиться в xcdatamodeld
. Переместите их оттуда. Есть справедливый шанс, что они запутывают компилятор.
Во-вторых, ошибка указывает, что Core Data не может найти вашу модель. Вы создали данные, а затем коснулись модели? Если это так, вы находитесь в противоречивом состоянии и должны исправить это либо путем удаления данных (что предложил Филипп), либо путем изменения ваших изменений модели НАЗАД.
Ответ 20
Эта проблема обычно возникает из-за несовместимости между версией, на которой была создана DB. Общий подход к этой проблеме заключается в удалении приложения и переустановке. Но в вашем случае версия DB полностью отличается от Xcode 3.2 и 4.2. Поэтому лучше использовать ту же версию Xcode для DB.
Ответ 21
Я получал ошибку, но причина, по которой я получал ошибку, состояла в следующем:
Вначале я имел одну Entity с именем "Entry" и имел одну строку, сохраненную для этого объекта в базе данных. Затем я добавил еще один Entity с именем "Person" и после добавления, который пошел на сборку и получил ошибку. Поэтому я решил проблему, удалив "Person" Entity, а затем создав приложение, удалив строку, которая была в "Entry", а затем закрыла приложение. Затем я полностью удалил приложение с моего телефона, а затем восстановил его, и он работал нормально. Не уверен, какой шаг исправил проблему (удаление строки или приложения), но, надеюсь, если вы ищете решение, это поможет.:)
Изменить: О, и если вы беспокоитесь об удалении своего нового Entity (в моем случае "Person" ), чтобы снова создать приложение, помните, что вы можете вернуть его позже, используя CMD + Z!
Ответ 22
У меня была эта проблема - я сначала reset мой симулятор, а затем очистил проект и перестроил. И затем он работает.
Ответ 23
При изменении данных ядра (добавление поля в таблицу, удаление поля и т.д.), файл sqlite в папке документов приложений должен быть синхронизирован с вашей схемой.
Этот файл не перезаписывается по умолчанию, этот файл необходимо восстановить.
Выполните следующие действия:
-
Перейдите в папку, указанную NSURL. (Этот путь может быть найден в сообщении об исключении, сгенерированном приложением перед сбоем.)
пример:/Пользователи//Library/Поддержка приложений/Симулятор iPhone//Приложения//Документы
-
удалить или переименовать файл sqlite
- Очистить и перезапустить приложение
- Приложение Rerunning создаст новый файл sqlite.
Это обеспечит синхронизацию схемы и Xcode.
Ответ 24
Для разработки приложений Mac:
- Очистить проект
- Очистить полученные данные
- Перейдите в /Users/YOUR_NAME/Library/Containers/YOUR_APP_BUNDLE_ID/Data/Documents/и удалите все файлы внутри (такие как ".sqlite", ".sqlite-shm"...)
Это сработало для меня, надеюсь, это могло бы быть полезным.
Ответ 25
iOS Simulator → Reset Содержание и настройки...
Работал для меня
iOS Simulator → Reset Содержание и настройки... → Reset
Работает на iOS9 (xcode 7.1), а также