0

首先让我声明这不是核心数据迁移问题。我实际上并没有考虑更改核心数据模型,而是在应用更新期间添加其他项目。

过程如下:

1) 应用程序是使用预加载的核心数据创建的。具体来说,一个清单。2) 用户可以通过更改某些值(拥有的、想要的等)来编辑此清单,但不能删除项目 3) 我发布了包含新项目的更新。用户现有数据未修改(除非我需要出于勘误目的进行更改)

我目前通过创建 NSUserDefaults 来检查用户是否收到更新,如果没有,则添加新项目。例如,如果用户从版本 1.4.3 升级到 1.4.4,应用程序将检查并添加在 1.4.4 中添加的项目。但是,如果应用程序从 1.4.0 升级到 1.4.4,它将检查并添加在 1.4.1、1.4.2、1.4.3 和 1.4.4 中添加的项目。此外,如果用户正在安装 1.4.4 版的新应用程序,则较新的项目已经是预加载的一部分,并且它知道不应用任何以前的更新。更新应用为 .plist/xml 文件

该系统目前运行良好,但它变得很麻烦,因为我现在在我的应用程序中有 38 个 plist 文件和 37 个 if/else 语句检查是否应用了更新。

一定会有更好的办法。我最初的想法是在应用程序中有两个数据库......一个我用应用程序更新更新,第二个可以由用户编辑。然后,随着每次应用程序更新,将比较数据库,并将数据库中的任何新项目复制到可编辑商店。我担心这将是一个漫长的过程(目前有超过 37,000 个项目,当我在更新中添加 400-500 个时很好,但是遍历 37,000 个项目并复制新项目是否需要很长时间?)

我想这个问题对于这个网站来说可能太主观了,如果是的话,我很抱歉,但我们将不胜感激!

扎克

4

1 回答 1

3

您可以使用一个预加载数据存储来执行此操作,而无需更新属性列表或if如下语句:

  1. 将应用程序当前版本存储在用户默认值中,以便在更新期间您可以将其检索为以前的版本(听起来您已经这样做了,但我想澄清一下)。

  2. 在预加载存储中,添加三个整数字段,它们对应于添加该预加载项的主要版本、次要版本和点版本。例如,如果在 1.4.3 版本中添加了一个项目,则major= 1、minor= 4 和point= 3。

  3. 在更新期间向用户的数据存储添加新项目时,从用户默认值中获取以前的应用程序版本,并从中获取主要、次要和点更新编号。如果用户是从 1.4.0 版本升级,使用previousMajor= 1, previousMinor= 4, previousPoint= 0。将这些值默认为零,这样如果用户是第一次安装应用程序,这三个值都为零。

  4. 使用如下谓词从预加载存储中获取需要添加的任何内容:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"major > %d and minor > %d and point > %d", 
        previousMajor, previousMinor, previousPoint];
    
  5. 需要添加 fetch 找到的所有内容。添加它,你就完成了。

于 2013-10-01T17:58:20.133 回答