更新商店中的实时应用以使用当前不使用Core Data的Core Data

时间:2011-04-22 02:06:39

标签: objective-c sqlite core-data app-store

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

感谢您的帮助

2 个答案:

答案 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 更新可能会变得棘手。尽可能让模型尽可能正确。