2011-04-22 96 views
0

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

感谢您的帮助

回答

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甚至在开发过程中我改名字频繁,否则人们可能会浪费大量的时间寻找编码是不是真的存在错误...

+0

好了,我要去测试了这一点。感谢您的回应! – Rick 2011-04-22 06:10:05

+0

这两个答案都是有用的,虽然这个答案更直接回答我原来的问题所以这就是为什么我接受了这个响应 – Rick 2011-07-28 04:33:29

+0

@Rick具有u尝试了一下。我有一个问题,我在App Store中有一个应用程序,我将发布它的新版本,并且我已经更改了数据库结构,因此对我有帮助。 – 2012-08-03 14:33:01

0

一个应用程序商店更新替换整个应用程序包,所以一切都在你的应用程序包,包括任何核心数据模型,都将包含在内。您可以通过在自己的设备上安装Ad Hoc或开发人员版本构建App Store(不首先删除)来测试此功能。在编译的应用程序中,模型文件被编译或处理,并具有不同的扩展名(.momd,.mom)。所以你会看到那些,而不是.xcdatamodeld或.xcdatamodel。

其他缺陷:现在,核心数据数据文件不是你的包的一部分。如果您希望更新的应用程序以空数据库开头,则不必做任何特殊的事情。但是,如果您想要使用预先填充的数据库进行安装/更新,则必须找出将该数据库放入设备的读写位置的方法。基本上,你生成一个核心数据文件,在应用程序包包括它作为您的Xcode项目的一部分,那么在第一次发射,在编程您的文档或库文件夹(使用正确的可可API寻找这些)某处复制它。

陷阱2:修改与SQLLite在Mac上的空核心数据文件建议在一些网站上,但苹果专门DIS-建议。相反,您可能会编写一个iOS应用程序,将数据放入核心数据并在模拟器中运行。 How do I initialize a store with default data?

作为user387184指出,你的下一个更新改变现有的核心数据的数据库模型可能很麻烦。尽可能第一次尝试让模型正确无误。

相关问题