iPhone:如何通过外键管理核心数据关系

时间:2011-06-01 07:03:47

标签: iphone core-data foreign-keys

我有一个应用程序在服务器端和iOS客户端使用数据库。我使用HTTP服务在服务器端的SQL Server和iPhone上的Core Data之间进行同步。

我有一些像这样的核心数据对象:

ProductGroup
Attributes:
id
Relationships:
products

Product
Attributes:
id
productGroupId
Releationships:
productGroup

由于服务器的限制,我无法使用增量同步。当我同步我的数据时(例如)我必须删除所有ProductGroup对象,从服务器获取响应,然后创建新的(以及一些旧的)。

问题是,如果我productA属于productGroupB,通常我可以productA.productGroup,但删除productGroupB并创建另一个{{1}}之后内容,关系失去了。

所以我在徘徊有没有办法管理FK的关系,比如.NET中的Entity Framework,所以我仍然可以在重新创建之后在关系的另一端找到该对象。

1 个答案:

答案 0 :(得分:1)

删除ProductGroup对象时会失去关系,因为Core Data不是SQL。在关系的情况下,Core Data不关心关系另一侧的对象的属性,它只关注特定对象。您可以拥有任意数量的具有完全相同属性但关系不同的对象,并且对象将完全不同。核心数据关系不是SQL连接或键,而是对特定托管对象的持久指针式引用。删除对象,指针也必须去。

要完成您想要的操作,您可以使用一个可以动态获取Product.id属性的fetched属性。然而,这是一种相当笨拙的做事方式。在这种情况下,您不必使用获取的属性。

我认为您需要重新考虑您的设计。我从未见过你必须删除实体/类的每个实例只是为了添加或删除对象的情况。实际上,你不可能一次性做到这一点。相反,您必须获取对象,然后逐个删除它们。如果需要删除或更新每个对象,您可能已经很好地检查了它们。

听起来你从服务器收到了大量的SQL格式数据,你认为你必须从头开始构建对象图。你真的不应该这样做。您必须解析数据以创建新的ProductGroup对象,因此您应该使用该解析的结果来更改现有的ProductGroup对象。

在伪代码中,它看起来像:

Add a "synced" flag to ProductGroup entity in the data model

Set "synced" of every ProductGroup object to "false"
Extract data for a ProductGroup from server glob
Using data fetch for an existing ProductGroup object
If extracted data matches and existing ProductGroup object
  update existing ProductGroup object
  set synced of ProductGroup object to true
else
  create new ProductGroup object with data
  set synced of new ProductGroup object to true
Delete all ProductGroup objects where synced == false

这里要记住的重要一点是,您正在处理对象而不是表,列,行或连接。熟练使用SQL的人通常认为Core Data只是SQL的对象包装器。它不是。它是一个对象图管理器,可能会或可能不会使用远远落后的SQL来将对象图持久化(冻干)到磁盘。

你必须始终在对象中思考。您为使用SQL而开发的直觉更有可能导致您误入歧途而不是帮助您使用Core Data。