目标C语言 更新store中的live应用程序以使用当前不使用Core Data的Core Data



我目前在商店中有一个应用程序,它是sqlite支持的,不使用Core Data。在过去,当我想要发布一个有SQLite变化的更新时,更新将包括一些检测应用程序版本的代码,并在必要时以编程方式更新表。现在我正在进行一个使用Core Data的更新。我不关心当前存在的任何旧数据,我知道如何通过编程方式删除所有旧的SQLite表。是否所有的核心数据模型文件都包含在更新二进制文件中,还是我必须以编程方式生成部分或全部核心数据模型?.xcdatamodeld是否包含在二进制文件中?还有其他需要警惕的陷阱吗?

谢谢你的帮助

对于核心数据,在更新到新版本时可能会非常棘手。我经历过很多次,即使是核心数据模型中最微小的变化也会导致奇怪的应用行为(在某种程度上可以理解)。避免任何不必要的副作用的最简单方法就是更改名称。这里的代码

- (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即使在开发过程中,我也经常更改名称,否则可能会浪费大量时间寻找实际上不存在的编码错误…

App Store更新将替换整个应用包,所以你的应用包中的所有内容,包括任何Core Data模型,都将被包含在内。你可以通过在自己的设备上安装Ad Hoc或开发者版本来测试这一点(无需先删除)。在编译后的App中,模型文件被编译或处理,并且具有不同的扩展名(。momd .mom)。所以你会看到这些而不是。xcdatamodeld或。xcdatamodel。

其他缺陷:现在,Core Data Data 文件不是bundle的一部分。如果你想让更新后的应用从一个空数据库开始,你不需要做任何特别的事情。但是如果你想安装/更新一个预填充的数据库,你必须想办法把这个数据库放到设备上的读写位置。基本上,你生成一个Core Data文件,将其作为Xcode项目的一部分包含在应用程序包中,然后在第一次启动时,以编程方式将其复制到文档或库文件夹的某个地方(使用正确的Cocoa API来查找这些)。

缺陷#2:在Mac上用SQLLite修改一个空的核心数据文件在一些网站上是建议的,但苹果公司特别不推荐。相反,你可以编写一个iOS应用程序,将数据放入core data并在模拟器中运行。如何使用默认数据初始化存储?

正如user387184所指出的,更改现有Core Data数据库上的模型的下一个更新可能会很棘手。

最新更新