首先让我说这不是核心数据迁移问题。我实际上并不是在考虑更改Core Data模型,而是在应用更新期间添加其他项目。
流程如下:
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个项目并复制新项目?)
我认为这个问题对于本网站来说可能过于主观,如果是这样,我会道歉,但建议将不胜感激!
扎克
答案 0 :(得分:3)
您可以使用一个预加载数据存储执行此操作,而不使用更新属性列表或if
这样的语句:
将应用当前版本存储在用户默认值中,以便在更新过程中您可以将其检索为以前的版本(听起来您已经这样做了,但我想要清楚)。
在预加载存储中,添加三个整数字段,这些字段对应于添加了预加载项的主要版本,次要版本和次要版本。例如,如果在1.4.3版中添加了一个项目,major
= 1,minor
= 4,point
= 3。
在更新期间向用户的数据存储添加新项目时,从用户默认值获取以前的应用程序版本,并从中获取主要,次要和点数更新编号。如果用户从版本1.4.0升级,请使用previousMajor
= 1,previousMinor
= 4,previousPoint
= 0.将这些值默认设置为零,以便在用户安装时该应用程序是第一次,这三个都是零。
使用谓词来获取需要从预加载存储中添加的任何内容:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"major > %d and minor > %d and point > %d",
previousMajor, previousMinor, previousPoint];
需要添加fetch发现的所有内容。添加它,你就完成了。