2013-04-12 64 views
0

我有一些数据需要从服务器(后端)加载。例如,让我们说我有一个用户和事件的实体。它们之间的关系是多对多的(用户可以参加很多活动,活动可以有很多参与者)。所有数据都远程存储在后端,并在本地存储在Core Data中。当我从后端下载数据时,我将它转换为NSManagedObjects并将其存储在NSManagedObjectContext中。一切都很简单,但...在核心数据中存储关系中不存在的对象的数量

当我下载一个我想知道的事件列表,这个事件有多少与会者。但是我不能在同一个请求中下载用户列表,因为这完全是矫枉过正。我需要的是下载一个用户唯一ID的列表,这样我就可以拥有两件事:参加者总数和下载具体用户详细数据的方法(通过唯一ID)。或者还有另一个例子:我需要知道与会者的总数并下载一组有限的数据,因此我可以在CoreData中创建一些实体,但不是全部。

所以主要问题是我该如何将这些信息存储在我的CoreData中?这意味着我需要知道,对于某些实体来说,关系中有一些实际上并不存在于CoreData中的相关实体,但我知道它们中应该有多少实体。我想到的第一件事是在我的事件实体中有一个叫做usersCount的属性,但是这似乎有点肮脏。这种情况的最佳做法是什么?

如果问题不够清楚,请发表评论,以便我可以添加一些更具体的细节。

+0

您是否考虑在核心数据中创建关系实体?这样用户和事件可以有点独立,每个与关系实体有多对多的关系。 –

回答

1

当你下载一个事件与相应的用户ID列表,那么你可以创建 的Event对象以及相关的User对象,但您填写只有“用户id” 在用户对象的属性。

稍后,当您下载完整的用户信息时,将更新现有(不完整)对象 或创建新的用户对象。 “核心数据编程指南” 中的Implementing Find-or-Create Efficiently描述了一种可能有用的模式。

所以我们的想法是首先创建不完整信息的核心数据对象,然后使用详细信息更新 对象。优点是您可立即建立所有关系,例如即使用户信息 尚未完成,也可以对相关用户进行计数。

+0

谢谢。但有一些缺点 - 我将不得不使用userId以外的所有属性为可选。听起来不太好。似乎我不得不选择两个邪恶中的一小部分。 – DemoniacDeath

+0

@DemoniacDeath:这是正确的。但我认为可选属性没有缺点。我更愿意直接检查程序逻辑中条目的有效性。强制属性意味着保存上下文可能会失败。 - 但你的里程可能会有所不同! –

1

有一个属性来存储计数没有什么肮脏的,特别是如果这些实体通过单独的请求检索和分页。