2013-02-27 30 views
0

我有一个Mac OS应用程序,它使用核心数据将其对象保存到磁盘,由sqlite支持。在可可中坚持数组控制器的内容和顺序

我有一个tableView可以检查所有的NSManagedObject子类。这绑定到绑定到managedObjectContext中的实体的arrayController。

使用这个arrayController中的对象,我加载另一个arrayController,它支持另一个tableView,它用于组织对象以准备导出到tsv文件。这个tableView允许拖放以重新排序和删除条目 - 但这些都不会影响managedObjectContext。

将第二个arrayController的内容保存到磁盘的最佳方法是什么,以便当文档重新打开时,tableView具有与以前相同的顺序的相同对象?

到目前为止,我设法调制的所有东西都是在关闭文档时设置的名为secondaryArrayOrder的managedObjects中添加属性,或者如果从次级arrayController中删除对象,则设置为nil。虽然这会起作用,但它似乎是错误的方法。

编辑 - 添加MacRuby标签,因为我现在用这种语言回答了我自己的问题。

+0

检查在答复diablosnuevos HTTP ://stackoverflow.com/questions/1077568/how-to-implement-re-ordering-of-coredata-records。它看起来很简单。你也可以尝试其他的答案。发布问题前,您可以搜索相关问题。 – Rakesh 2013-02-28 14:59:30

+0

谢谢Rakesh。但是,在我的问题的最后一段中,我特别说过,我不想将订单字段添加到我的对象中。他们为什么要关心他们的秩序? – ryecroft 2013-02-28 19:26:07

+0

但即使在你的回答中,你所做的或多或少都是一样的。不是将其添加到托管对象,而是使用objectId创建一个plist。 – Rakesh 2013-03-01 02:22:39

回答

0

我已经想通了一种方法来做到这一点。

我没有提到应用程序是MacRuby的问题,因为它不相关,但我不确定我是否已经将我的解决方案完美地转换为Objective-C,所以我会把它留作MacRuby。

每个NSManagedObject都有一个objectID为NSManagedObjectID的类,它在应用程序中唯一标识它。因此,例如,可以很容易地将这些文件作为plist文件中的字符串查询并保存到磁盘中。

theObjects = arrayController.arrangedObjects 
       .map { |e| e.objectID.URIRepresentation.absoluteString } 

# save theObjects to disk as a plist or json. 

这可以随后被用于下一次启动应用程序来重新创建阵列控制器中的内容以相同的顺序或打开文档时:

def loadArrayController(arrayOfIDStrings) 
    objects = arrayOfIDStrings.map { |e| 
    url = NSURL.URLWithString(e) 
    moID = managedObjectContext.persistentStoreCoordinator.managedObjectIDForURIRepresentation(url) 
    managedObjectContext.objectWithID(moID) 
    } 
    arrayController.addObjects(objects) 
    arrayController.setSelectedObjects([]) 
end