用于打开商店的模型与用于创建商店的模型不兼容
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于打开商店的模型与用于创建商店的模型不兼容相关的知识,希望对你有一定的参考价值。
我在xcode 3.2中创建了一个Core Data模型,在Xcode 4.2中升级后,我添加了NSManagedObject子类的新实体(请参阅新实体)。
首先,它看起来很奇怪,因为它与旧的不在同一组中。这是我的xcode 4.2上的图片(AlkitabDB是我在xcode 3.2中创建的,EndeDB是当前xcode版本中的新版本(4.2):
第二件事,我让它原样,然后我以与第一个实体(旧实体)相同的方式访问第二个实体(新实体),并出现标题错误。
这是错误:
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";
}
之前我找了解决方案,发现我应该从模拟器中删除应用程序并重新运行应用程序,但它不起作用。有谁知道这个问题的解决方案?请帮忙。
从模拟器中删除应用程序并对项目执行清理。这应该清除这些问题。删除应用程序时确保没有在调试器中运行,否则它实际上不会正确删除它。
如果你想确定它已经消失了,请在你正在运行的版本下查看你的应用程序文件夹的Users/INSERT_YOUR_USER_HERE/Library/Application Support/iPhone Simulator/
目录。
注意:这仅用于开发。对于生产,您需要实现某种迁移。谷歌“核心数据迁移”,轻量级迁移是最简单的。
在Swift 2.1中,Xcode 7最简单的解决方案是:
- 从模拟器中删除应用程序(Cmd + Shift + H进入主屏幕。长按应用程序,单击交叉,只需按照通常的方式从手机中删除应用程序)
- Cmd + Shift + H再次停止应用程序的跳舞
- 回到你的项目并重新运行
我在创建2个实体时从Core Data写入/读取时遇到了这个问题。删除应用程序并重新运行该程序修复了该问题
我刚刚在实体中进行了更改后删除了[Simulator App Folder]/Document/*.sqlite
文件并且它有效。当然,.sqlite文件包含将丢失的所有存储数据和结构。
请从模拟器中删除一个应用程序并清理代码然后运行。工作正常。它可能对你有所帮助。
如果您使用的是Swift。
按照@Stas的回答,在App Delegate中插入选项代替nil:
let myOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
NSInferMappingModelAutomaticallyOption: true]
if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: myOptions, error: &error) == nil {
尝试在模拟器中“重置内容和设置”。删除app和Clean build后为我工作
我的应用程序遇到了同样的问题(尚未在App Store中发布)。
以下是我修复它的方法:
- 运行清洁(Cmd + Shift + K)
- 重启ios模拟器
- iOS模拟器 - >重置内容和设置(来自导航栏)
(3)是最终让它正常运行的步骤。希望这可以帮助!
虽然有时您可以在更改托管对象模型中的架构时从设备中删除应用程序,但在某些情况下,这是不可能的,例如因为您已使用旧架构发布了应用程序。
如果是这种情况,则必须注意将旧数据迁移到新架构:
Core Data Model Versioning and Data Migration
您需要使用迁移迁移Core Data模型。每次更改模型时,都会使其不兼容而不进行版本控制。自我介绍,这是一个毛茸茸的话题。
如果对Core Data模型进行更改,则必须提供迁移策略,以告知Core Data如何将现有持久对象(用户使用当前发布的版本创建的对象)采用到新模型。
对于某些情况,Core Data能够自动推断从旧模型到新模型的映射。对于更复杂的更改,您可能必须实现一些执行迁移的逻辑。
详细信息可以在Core Data Model Versioning and Data Migration Programming Guide找到。
更新 qazxsw poi涵盖了Core Data轻量级迁移的基础知识,还有一些代码可以帮助您入门。
由于创建数据库的版本之间不兼容,通常会发生此问题。解决此问题的一般方法是删除应用程序并重新安装。但在你提到的情况下,数据库的版本在Xcode 3.2和4.2上完全不同。因此,最好使用相同版本的Xcode for DB。
删除应用有时并非如此!建议,您的应用已经发布!您不能只是将新实体添加到数据库并继续 - 您需要执行迁移!
对于那些不想深入了解文档并正在寻找快速修复的人:
- 打开.xcdatamodeld文件
- 单击编辑器
- 选择添加型号版本...
- 添加模型的新版本(添加了新的数据模型组)
- 选择主文件,打开文件检查器(右侧面板)
- 并在
Versioned core data model
下为当前数据模型选择新版本的数据模型 - 这不是全部)你应该执行所谓的“轻度迁移”。
- 转到你的
AppDelegate
,找到persistentStoreCoordinator
的创建地点 - 找到这一行
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
- 用
nil
替换@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES}
选项(实际上在该方法的注释代码中提供) - 在这里,你玩得开心!
附:这仅适用于轻量级迁移。要使您的迁移符合轻量级迁移的要求,您的更改必须限制在此窄带:
- 添加或删除属性(属性或关系)。
- 使非可选属性可选。
- 只要提供默认值,就可以选择非可选属性。
- 添加或删除实体。
- 重命名一个属性。
- 重命名实体。
对于Swift 4
coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])
首先,This answer here on Stack Overflow包中应该包含的唯一内容是xcdatamodeld
文件。您的子类不应该在xcdatamodel
中。将那些移出那里。他们很可能会混淆编译器。
其次,错误表明Core Data无法找到您的模型。您是否创建了数据然后触摸了模型?如果是这样,您处于不一致状态,需要通过删除数据(Philippe建议)或滚动模型BACK的更改来解决这个问题。
我收到错误,但我得到错误的原因是因为以下。
我最初有一个名为“Entry”的实体,并在数据库中为该实体保存了一行。然后我添加了另一个名为“Person”的实体,并在添加之后进行构建并获得错误。所以我通过删除“Person”实体然后构建应用程序解决了这个问题,删除了“Entry”中的行,然后关闭了应用程序。然后我完全从我的手机上删除了应用程序然后进行了重建,它工作正常。不确定哪一步纠正了问题(删除行或应用程序),但希望如果您正在寻找解决方案,这将有所帮助。 :)
编辑:哦,如果你担心删除你的新实体(在我的情况下是“人”)再次构建应用程序,记住你可以使用CMD + Z后来恢复它!
我有这个问题 - 我首先重置我的模拟器,然后清理项目并重建。然后它的工作原理。
当您更改核心数据(向表中添加字段,删除字段等)时,应用程序文档文件夹中的sqlite文件需要与您的模式同步。
默认情况下不会覆盖此文件,需要重新生成此文件。
跟着这些步骤:
- 转到NSURL指向的文件夹。 (此路径可在崩溃前由应用程序生成的异常消息中找到。)示例:/ Users // Library / Application Support / iPhone Simulator // Applications // Documents
- 删除或重命名sqlite文件
- 清理并重新运行应用程序
- 重新运行应用程序将生成一个新的sqlite文件。
这将确保架构和Xcode同步。
对于mac app开发:
- 清理项目
- 清理派生数据
- 转到/ Users / YOUR_NAME / Library / Containers / YOUR_APP_BUNDLE_ID / Data / Documents /并删除里面的所有文件(例如“.sqlite”,“。sqlite-shm”......)
它对我有用,希望这可能会有所帮助。
iOS模拟器 - >重置内容和设置...
为我工作
iOS模拟器 - >重置内容和设置... - >重置也适用于iOS9(xcode 7.1)
只需在AppDelegate.m文件中为核心数据方法创建persistentStoreCoordinator时添加Options属性,如下所示
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's saved 以上是关于用于打开商店的模型与用于创建商店的模型不兼容的主要内容,如果未能解决你的问题,请参考以下文章