核心数据中的索引关系

时间:2009-07-04 12:37:12

标签: objective-c cocoa-touch

我刚刚开始在iPhone SDK上使用Core Data,我正在寻找保存有序列表,类似于数组。但是,核心数据中的关系在检索时表示为集合。这使得难以保存对象的定位顺序。

一个很好的例子是当允许重新排序项目时表格视图中的数据项。一个简单的解决方案是在托管对象上包含索引属性。

考虑以下层次结构:

文件< -Many-to-many->的DataItem

不同的Document实例可以链接到同一个DataItem,每个Document可能引用一个或多个DataItem。因此,在DataItem中使用索引属性会导致该实例的可重用性降低,即您只能保存一个Document实例的索引。

关于如何在表视图中整齐排列层次结构但是仍然保持每个DataItem实例可重用的任何想法?谢谢!

3 个答案:

答案 0 :(得分:15)

从OS X Lion(10.7)开始,现在更加直截了当。 Cocoa现在支持与Core Data兼容的新NSOrderedSet类。此功能在iOS中也可用,但需要iOS 5.0或更高版本。这意味着如果您希望您的应用向后兼容早期版本的iOS或OS X,则无法使用此功能。

要获得订购,您只需打开Core Data模型编辑器,选择多对多关系并选中“已订购”复选框。

答案 1 :(得分:7)

您可以使用其他实体执行此操作,如下所示: alt text http://gallery.me.com/davedelong/100084/Screenshot-20on-202009-07-04-20at-2010-34-56-20AM/web.jpg?ver=12467253090001

Document可以通过使用类似的东西找到它的实际dataItem:

NSSet * documentDataItems = [[document orderedDataItems] valueForKey:@"dataItem"];

同样,DataItem可以通过执行相同的操作找到所有文档:

NSSet * dataItemDocuments = [[dataItem orderedPositions] valueForKey:@"document"];

答案 2 :(得分:3)

一个好的解决方案是在Document中保留一个单独的数据结构,以将DataItems映射到表视图中的某个位置。除了允许相同的DataItem存在于多个位置之外,如果您需要将DataItem添加到多个Documents,这个解决方案也可以工作。

当我看到保持核心数据对象的不同策略时,我找到了一个blog post,它解释了如何更详细地解释这一点,包括示例代码。