【问题标题】:iPhone CoreData migration of data onlyiPhone Core Data 只迁移数据
【发布时间】:2011-06-24 12:38:13
【问题描述】:

我有一个使用 CoreData 进行存储的 iPhone 应用程序。

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

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

虽然架构很少更改,但我经常需要更新应用程序数据以向用户提供新选项。

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

有什么想法吗?

_更新_

经过一番思考,我开始将应用程序设置为从包含新数据的 Web 服务器下载新的 sqlite3 文件。收到后,我的应用程序会将更新 sqlite3 文件中的数据复制到应用程序的工作数据库文件中,完全替换应用程序数据,但不会触及用户数据。

确定是否已应用更新的机制可以使用具有单个数据库版本号的文本文件,应用会定期下载该文件。如果这个数字大于上一次更新的数字(存储在本地),则继续更新,否则忽略。

【问题讨论】:

  • 嗨,Futureshocked,你找到答案了吗?我也面临同样的问题。我有一个名为 DefaultValues 的实体,我想在不触及其他实体中存在的用户数据的情况下使用少量新记录进行更新。不知道我到底要做什么??
  • 我还没有完成这个,但是我打算遵循的策略是将新数据捆绑到一个 sqlite3 文件中(虽然这无关紧要,它可能只是一个简单的 json 文件) ,通过应用程序将其下载到 iPhone 上,然后打开并根据需要将数据复制到应用程序自己的数据库中。希望这可以帮助。我已经实现了在手机上下载 sqlite3 文件的部分,然后时间不足:-(

标签: iphone core-data data-migration


【解决方案1】:

如果您只是在谈论将新条目添加到 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 = { 实体=菜单; }; }; 版本=“1.2”; }, { 数据 = { 1 = { 实体=菜单; }; }; 版本=“1.3”; }, { 数据 = { 1 = { 实体=菜单; }; }; 版本=“2.0”; }, { 数据 = { 1 = { 实体=菜单; }; }; 版本=“2.5”; } ); }]

【讨论】:

  • 谢谢迈克,这不完全符合我的情况。我有一个 sqlite3 数据库,用于 CoreData 在我的应用程序中的持久性。数据库约为 4MB,包含两组表:一组保存用户数据,另一组保存应用程序数据。数据库的大部分是应用程序数据,我需要能够用新的集合替换它(不影响用户数据)。
猜你喜欢
  • 2010-12-22
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
相关资源
最近更新 更多