您应该执行以下步骤
原因如下:
用于打开商店的模型与用于创建商店的模型不兼容
这是你如何做到的:
原因是因为您的新托管对象模型正在尝试使用旧版本的存储(第一次在您启动应用时创建)。
快速而又脏的修复方法是删除存储文件(〜/ Library / Application Support / YOUR_APP /中的某个位置)并再次启动应用程序。
供将来参考 - 如果您发布应用程序,并且在下一版本中应用程序已更改托管对象模型 - 您必须为其编写迁移。苹果文档中的核心数据编程手册涵盖了所有这些以及更多内容。
如果您从模拟器/设备中删除应用程序就足够了。
您不必更改项目中的文件(除了选择当前模型并使用菜单替换类: 的 编辑/创建NSManaged对象子类 强> )。
如果您处于开发模式,并且每次更改实体时都不想删除应用程序,我建议您使用此解决方案:
- (void)removeCoreDataStorage { // Where does the SQLite file go? NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); // Get one and only document directory from that list NSString *documentDirectory = [documentDirectories firstObject]; NSString *path = [documentDirectory stringByAppendingPathComponent:@"model.sqlite"]; NSError *error = nil; NSURL *storeURL = [NSURL fileURLWithPath:path]; NSURL *storeURLWal = [NSURL URLWithString:[storeURL.absoluteString stringByReplacingOccurrencesOfString:@".sqlite" withString:@".sqlite-wal"]]; NSURL *storeURLShm = [NSURL URLWithString:[storeURL.absoluteString stringByReplacingOccurrencesOfString:@".sqlite" withString:@".sqlite-shm"]]; BOOL isRemoveItemAtURL = [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]; if (isRemoveItemAtURL == NO) { NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason); } BOOL isRemoveItemAtURLWal = [[NSFileManager defaultManager] removeItemAtURL:storeURLWal error:&error]; if (isRemoveItemAtURLWal == NO) { NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason); } BOOL isRemoveItemAtURLShm = [[NSFileManager defaultManager] removeItemAtURL:storeURLShm error:&error]; if (isRemoveItemAtURLShm == NO) { NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason); } }
别忘了改变 path 用你自己的道路。
path
有时您需要从另一个应用程序创建的商店加载数据 - 例如一个应用程序仅用于从外部源加载数据并保存到商店中,其他应用程序使用此商店充满数据作为起点。
我不想说这是超级正确的,但是如果您在应用程序开发期间不时需要它:只需将商店中的UUID(通过SQLVue等)更改为您的应用程序所期望的正确的UUID 。在大多数情况下,您会在名为Z_UUID的唯一一列中找到名为ZMETADATA的表中的UUID。但请记住 - 仅用于快速调试/开发目的。不要以编程方式使用它。