【问题标题】:CoreData: efficient way to fetch and relate entitiesCoreData:获取和关联实体的有效方法
【发布时间】:2010-11-10 23:35:39
【问题描述】:

我有一个 CoreData 数据库,其中包含相互关联的对象。

EntityFoo - 属性:uniqueId,关系:与其他 EntityFoo 对象一对多,关系:与其他 EntityUnresolvedRelationship 对象一对多

EntityUnresolvedRelationship - 属性:uniqueId,inverseRelationship:返回 EntityFoo 对象

当我的 iPhone 应用程序启动时,我从 Web 服务中获取这些对象的信息。我解析 Web 服务响应并创建 Foo 实体。在我下载并解析数据并将 Foo 对象放入 CoreData 时,我不想花时间查找需要与该对象相关的其他 EntityFoo 对象,而且很可能我还没有一个 Foo 对象,如果它还没有被下载和解析,那么我很快就为这个关系创建了一个 UnresolvedRelationship 对象,并将 uniqueId 存储在其中,以便我以后可以解析这个对象的关系。

现在我试图找出最有效的方法来遍历所有 Foo 或 UnresolvedRelationship 对象并在所有 Foo 对象之间创建正确的 CoreData 关系。换句话说,最后我不想有 UnresolvedRelationship 对象...这只是暂时的... Foo 对象只会彼此有关系。

可能有 15,000 多个 Foo 对象。

有没有一种好方法来获取所有 Foo 对象和所有 UnresolvedRelationship 对象,我可以遍历其中一个数组并通过它的 uniqueId 快速找到另一个数组中的匹配实体,以便我可以设置CoreData 关系?

无论如何,会喜欢任何指针。

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

    您应该将此作为解析来自 Web 服务的数据的一部分。这将是最有效的方法。您处理此问题的方式是您猜测关系查找会很慢。这是一种糟糕的优化方法。

    获取对象并链接它们不会很慢,除非您将它们实现(错误)到内存中。如果您对 15K 对象进行故障排除,无论如何它都会很慢。

    在解析时设置关系,在解析期间有效地使用自动释放池,并在解析期间以一致的时间间隔重置上下文以减少内存。这是最好的选择。

    【讨论】:

    • 谢谢马库斯。我无法在解析期间解决所有关系,因为我还不知道我需要关联的所有对象。因此,这似乎是一个两步过程:下拉所有对象,然后设置所有关系。我目前的解决方法是获取所有对象并将它们放入基于 uniqueId 的查找字典中。然后我获取所有未解析的对象并遍历它们并设置关系。我删除临时对象并在最后保存更改。
    • 在进行这种关系配对之前是否保存了对象?
    • 是的。在下载和解析操作期间,我正在按照您的建议使用自动释放池仔细管理内存,并且我正在将对象保存到持久存储中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多