繁体   English   中英

核心数据:可能进行批量更新吗?

[英]Core Data: Mass updates possible?

是否可以对核心数据中的给定实体进行批量更新?

例如,给定一个Person实体,我可以做这样的事情:

Person.update(@"set displayOrder = displayOrder + 1 where displayOrder > 5")

还是我获取所有所需实体,然后循环遍历并分别更新它们的唯一选择???

谢谢

您正在考虑将核心数据视为SQL。 大错。

实体不是表,实例不是记录。 每个实例都是其自己的对象,因此您必须单独更改它们。 否则,使用对象图就没什么意义了。

Edit01:

然后,您将如何处理以下UI问题:您想提供一个按“名称”排序的Person实体表。 但是...用户可以重新排序此表中显示的Person实体,并且您希望持久存在,以便现在按“名称” +“ displayOrder”(或任何您想调用的实体)对这些实体进行排序。 如果不作为Person实体的属性,那么在哪里维护“ displayOrder”的值?

哦,我明白了您的尝试。 您使它变得比必须困难得多。 核心数据可以轻松处理此类功能。

排序顺序不是(通常, 请参见下文 )数据模型的各个方面,而是视图控制器,即它们只是用于以有意义的方式向用户显示数据的临时命令。 因此,它们是根据需要动态创建的。 在这种情况下,您将创建一个NSSortDescriptor,以对所需的属性键进行排序。 然后设置您的提取请求以使用那些排序描述符。 然后,您的提取操作将以所需顺序返回包含元素的数组。

没有大惊小怪。

如果用户希望使用不同的排序顺序,则只需创建一组不同的排序描述符即可。 没有理由将排序逻辑包括在实际数据模型本身中,并且有很多理由不这样做。

在所有iPhone API所基于的Model-View-Controller设计模式中,将实际数据与显示区分开是非常重要的。 您不想在数据模型中包括显示逻辑,也不想在显示中存储数据或具有数据操作逻辑。

Edit02:

在我的情况下,用户将需要能够返回到应用程序,查看表并按其放置顺序查看Person实体。 除了具有displayOrder属性之外,您还可以怎么做?

如果确实要将订单另存为用户数据,则需要将其包括在数据模型中。

碰巧的是,我只是有这样的需要。 这是我处理少量对象的方法。 这些是NSMangedObject子类的方法。 这适用于数百个轻量级对象。

如果您有大量重对象(数千个),建议您创建一个轻量级实体来实现链接列表。 将其称为OrderEntity。 它将具有索引属性,与索引实体的关系,与前一个OrderEntity的关系以及与下一个OrderEntity的关系。 (使用轻量级实体可以避免对繁琐的对象进行故障处理,从而节省了内存,并使所有操作变得更快。只需在需要显示索引对象时就对它进行故障处理。)

然后,您使用标准的链接列表方法来插入,交换和移动列表中的项目。 然后,对已移动的对象调用update,它们将调用所有后续的OrderEntities来更新其索引。

就像拥有一个调用下一​​个OrderEntity,传递当前对象索引并告诉下一个将其顺序设置为passedIndex + 1的方法一样简单。 这基本上就是您要模仿的SQL语句的确切功能(因为逻辑当然是相同的。)

如果您需要做很多事情,请创建一个NSManagedObject子类来处理索引,然后让您的索引类继承自该类。

不,您不能在Core Data中进行“批量”更新。 如果您认为要执行此操作,则根本上就没有了Core Data的要点:它不是关系数据引擎,而是图形管理框架引擎。 像您描述的那样,批量更新就是对数据表的处理。 您可以使用对象图进行迭代,以及对象图管理引擎。

如果您的数据确实是表格形式的(可能是您自己的表),那么核心数据可能不是最佳选择。 批量更新问题是原因布伦特西蒙斯一个切离从核心数据对于某些应用。 与往常一样,使用正确的工具完成正确的工作。

在这种情况下,可能有更好的方法来做您想要的事情。 显示顺序实际上不是模型属性; 更恰当的说是view属性。 您可能想要创建一个提取的属性,以对模型中的某些内容进行正确排序。 如果那是一个日期,则具有date属性。 如果这是显示顺序的首选项,则您可能希望将这些项目保留在链接列表样式图中,其中每个实例都具有上一个/下一个关系。 更新它很容易,并且显示它们(顺序操作)也很容易。

正确的方法是取回所有Person对象的数组(只需对所有Person实体进行获取请求,而无需指定谓词)。

然后使用NSArray方法makeObjectsPerformSelector:withObject:进行批量更改-您可能需要在对象上创建一个自定义方法,以使其执行所需的确切更改。

然后在NSManageObjectContext上调用save,您的更改将被存储。

正如其他人指出的那样,您不像SQL那样发布文本更新-但这并不意味着yu仍然不能进行批量更改。

无法使用Core Data进行类似批量SQL的更新,您将不得不遍历所有对象来更新值。

如果要保存displayOrder属性,则需要将其作为属性存储在数据模型中。 这是一个如此普遍的问题,令我惊讶的是还没有内置的解决方案。

您不能这样做,至少要绕过整个Core Data对象层次结构(实际上确实不建议这样做)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM