如何解决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更容易误入歧途。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。