我目前在商店中有一个由SQLite支持的应用程序并且不使用Core Data。在过去,当我想要发布具有SQLite更改的更新时,更新将包括一些可以检测应用程序版本的代码,并在必要时以编程方式更新表。现在我正在开发使用Core Data的更新。我不关心当前存在的任何旧数据,我知道如何以编程方式删除所有旧的SQLite表。是否所有Core Data模型文件都包含在更新二进制文件中,或者我是否必须以编程方式生成部分或全部Core Data模型? .xcdatamodeld是否会包含在二进制文件中?我应该警惕任何其他陷阱吗?
感谢您的帮助
答案 0 :(得分:0)
使用核心数据,在更新到新版本时可能会非常棘手。我经历了很多次,即使核心数据模型中的最轻微变化也会导致奇怪的应用程序行为(在某种程度上可以理解)。避免任何不必要的副作用的最简单方法是只更改名称。这里是代码
- (NSPersistentStoreCoordinator *) persistentStoreCoordinator {
// D_IN;
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
// Allow inferred migration from the original version of the application.
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"myData073.sqlite"]];
NSError *error = nil;
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl
options:options error:&error]){
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
// D_OUT;
return persistentStoreCoordinator;
}
所以你真正需要做的就是将名称myData073.sqlite
更改为例如myData074.sqlite
数据模型描述文件实际上不是二进制文件的一部分,但它背后的模型肯定是所有类和访问方法。你不必担心这一点。 ps甚至在开发过程中我经常更改名称,否则可能会浪费大量时间寻找那些并不存在的编码错误...
答案 1 :(得分:0)
App Store更新会替换整个应用包,因此您的应用包中的所有内容(包括任何Core Data模型)都将包含在内。您可以通过在自己的设备上通过App Store构建安装Ad Hoc或开发人员构建来测试这一点(不先删除)。在已编译的App中,模型文件被编译或处理,并具有不同的扩展名(.momd,.mom)。所以你会看到那些而不是.xcdatamodeld或.xcdatamodel。
其他陷阱:现在,核心数据数据文件不属于您的捆绑包。如果您希望更新的应用程序以空数据库开头,则不必执行任何特殊操作。但是,如果要使用预填充数据库进行安装/更新,则必须找到一种方法将该数据库放入设备的读写位置。基本上,您生成一个Core Data文件,将其作为Xcode项目的一部分包含在应用程序包中,然后在首次启动时,以编程方式将其复制到Documents或Library文件夹中的某个位置(使用正确的Cocoa API查找这些文件)。 p>
陷阱#2:在某些网站上建议使用Mac上的SQLLite修改空核心数据文件,但Apple特别推荐使用。相反,您可能会编写一个iOS应用程序,将数据放入核心数据并在模拟器中运行。 How do I initialize a store with default data?
正如user387184指出的那样,更改现有Core Data数据库模型的 next 更新可能会变得棘手。尽可能让模型尽可能正确。