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

问题描述

| 我有一个可以在服务器端和iOS客户端上使用数据库的应用程序。我使用HTTP服务在服务器端的SQL Server和iPhone的Core Data之间进行同步。 我有一些像这样的核心数据对象:
ProductGroup
Attributes:
id
Relationships:
products

Product
Attributes:
id
productGroupId
Releationships:
productGroup
由于服务器的限制,我无法使用增量同步。同步数据时(例如),我必须删除所有ProductGroup对象,从服务器获取响应,然后创建新对象(再创建一些旧对象)。 问题是,如果我有一个属于
productGroupB
productA
,通常我可以做
productA.productGroup
,但是删除
productGroupB
并创建另一个具有相同内容的后,关系就消失了。 所以我在徘徊,有没有办法通过FK管理关系,例如.NET中的Entity Framework,因此在重新创建之后,我仍然可以在关系的另一端找到对象。     

解决方法

        删除
ProductGroup
对象时,您会失去关系,因为Core Data不是SQL。对于关系,Core Data不在乎关系另一侧的对象属性,它仅针对特定对象。您可以具有属性完全相同但关系不同的任意数量的对象,并且这些对象将完全不同。核心数据关系不是SQL连接或键,而是对特定托管对象的持久指针式引用。删除对象,指针也必须走。 要完成所需的操作,可以使用fetched属性,该属性将动态获取
Product.id
属性。但是,这是一种相当笨拙的处理方式。在这种情况下,您不必诉诸于获取的属性。 我认为您需要重新考虑您的设计。我从未见过要删除实体/类的每个实例以添加或删除对象的情况。实际上,您不能一口气做到这一点。取而代之的是,您必须先获取对象,然后将其一一删除。您可能已经很好地检查了每个对象,以便在使用时是否需要删除或更新它。 听起来您从服务器接收到大量的SQL格式数据,并且您认为必须从头开始构建对象图。您真的不需要。无论如何,您都必须解析数据以创建新的“ 5”对象,因此您应使用该解析的结果来更改现有的“ 5”对象。 用伪代码看起来像:
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更容易误入歧途。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...