2011-06-01 53 views
1

我有一个应用程序在服务器端和iOS客户端的数据库上工作。我使用HTTP服务在服务器端的SQL Server和iPhone上的Core Data之间进行同步。iPhone:如何通过外键管理核心数据关系

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

ProductGroup 
Attributes: 
id 
Relationships: 
products 

Product 
Attributes: 
id 
productGroupId 
Releationships: 
productGroup 

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

的问题是,如果我有一个productA属于productGroupB,平时我可以做productA.productGroup,但我删除productGroupB然后再创建一个具有相同内容之后,双方的关系将丢失。

所以我徘徊是否有任何方式来管理FK的关系,如.NET中的实体框架,所以我仍然可以在重新创建后在关系的另一端找到对象。

回答

1

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

要完成你想要的任务,你可以使用一个fetched属性,它将动态获取Product.id属性。但是,这是一种相当笨拙的做事方式。在这种情况下,您不应该求助于提取的属性。

我认为你需要重新考虑你的设计。我从来没有见过要删除实体/类的每个实例来添加或删除对象的情况。作为一个实际问题,你不能一次就做到这一点。相反,您必须获取对象,然后逐个删除它们。您可能会检查每个对象,看它是否需要删除或更新。

听起来好像您从服务器接收到大量的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。

+0

它是这样一个详细的答案。我今晚会尝试你的伪代码。我认为它应该工作,因为我从服务器上下载Product.id'。我确实收到来自服务器的类似CVS的数据。iPhone客户端上的增量同步从来没有出现在我的脑海中,因为我认为这是一个服务器端的工作。 Symbian和Android客户端上的程序员使用Symbian OS DBMS或Sqllite,他们在删除和重新创建时工作良好。 – 2011-06-02 01:47:54

+0

我想我可以在iOS上创建自己的ORM框架,我个人喜欢M $的实体框架和LINQ,我想我会在某天将它们移植到iOS。 – 2011-06-02 01:51:02

+0

不要让问题变得更加困难。对象图简化了很多在过程SQL等中更复杂的问题。根据从非对象服务器获取的数据添加和删除对象和关系是Core Data应用程序中非常常见的任务。我认为你的任务并不像你认为的那么困难。当他们开始使用对象图时,这对于熟练使用SQL和类似API的人来说很常见。 – TechZen 2011-06-03 03:32:44