iPhone CoreData数据迁移只有

问题描述:

我有一个使用CoreData进行存储的iPhone应用程序。iPhone CoreData数据迁移只有

持久性存储(一个sqlite3的数据库),运输与它的几个实体填充数据。这些数据用于在应用程序中创建各种菜单和选项。我们称这些数据为“应用程序数据”。

应用程序使用其他几个实体来存储用户数据。

尽管架构很少发生变化,但我经常需要更新应用程序数据以向用户提供新选项。

我有一个MacRuby脚本,它从一堆CSV文件中获取新数据并更新开发计算机上的sqlite3数据库,但我不确定用新应用程序数据更新现有已部署应用程序的最佳方式是什么(请记住,没有模式更改),而不会影响用户数据。

任何想法?

_ 更新 _

一点思考后,我收到面向设置从一个包含新数据的网络服务器下载新的sqlite3文件的应用程序。一旦收到,我的应用程序会将更新sqlite3文件中的数据复制到应用程序的工作数据库文件中,完全替换应用程序数据,但不会触及用户数据。

一种用于确定是否有更新已经应用可以使用文本文件与单个数据库的版本号该应用程序会定期下载机制。如果这个数字大于先前更新(本地存储)的数量,则更新将继续,否则将忽略它。

+0

嗨Futureshocked,你有没有找到答案。我也面临同样的问题。我有一个名为DefaultValues的实体,我想在不触及用户数据到其他实体的情况下更新几条新记录。不知道我到底要做什么? – 2011-03-02 23:10:49

+0

我还没有完成这个,但我打算遵循的策略是将新数据绑定到sqlite3文件中(尽管这并不重要,它可能只是一个简单的json文件),请将它下载到iPhone上通过应用程序,然后打开并根据需要在应用程序自己的数据库中复制数据。希望这可以帮助。我已经实现了在手机上下载sqlite3文件的部分,然后得到时间不足:-( – futureshocked 2011-03-04 03:07:34

如果你只是在谈论添加新条目到sqlite3的存储是有一个原因,你不能在应用程序启动这样做呢?我自己并不需要这样做,但我不明白为什么不能创建包含所需数据的属性列表,并在启动应用程序时执行更新。

NSString *applicationDataPath = [[NSBundle mainBundle] pathForResource:@"ApplicationData" ofType:@"plist"]; 
NSString *previousVersion = [[NSUserDefaults standardUserDefaults] stringForKey:@"VERSION"]; 

NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 

/* Don't bother processing updates if the version last run is the same as the current version. */ 
if (! [previousVersion isEqualToString:currentVersion]) 
{ 
    NSArray *versionList = [applicationData objectForKey:@"Versions"]; 

    BOOL process = (nil == previousVersion); 
    for (NSDictionary *versionData in versionList) 
    { 
    NSString *version = [versionData objectForKey:@"version"]; 
    if (process) 
    { 
     // Send dictionary for this version update to some method to process it.. 
     [self processUpdate:versionData]; 
    } 

    if (!process && [version isEqualToString:previousVersion]) 
     process = YES; 
    } 
}  

想法是plist包含描述应用程序的每个版本的字典数组以及应该为该版本更新的数据。我下面的plist例子缺少任何必要的细节,所以只是一个存根,以获得这个想法。

而且,如果代码实际工作不知道;)只是我想我可能会做,如果我不得不面对同样的事情,假设我正确理解您的问题。

还应注意到,这个你想更新存储在用户的默认值在应用程序启动的数据更新后,以前的版本,使其只运行一次。

[{ 版本=( { 数据= { 1 = { 实体=菜单; }; }; 版本= “1.1”; }, { 数据= { 1 = {entity = Menu; }; }; version =“1。2" ; }, { 数据= { 1 = { 实体=菜单; }; }; 版本= “1.3”; }, { 数据= { 1 = { 实体=菜单; }; }; 版本= “2.0”; },{ 数据 = { 1 = { 实体=菜单; }; }; 版本= “2.5”; } ); }]