0

我有一个 Mac OS 应用程序,它使用核心数据将其对象持久保存到磁盘,由 sqlite 支持。

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

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

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

到目前为止,我设法编写的只是向 managedObjects 添加一个名为secondaryArrayOrder 的属性,该属性在关闭文档时设置,或者如果从辅助arrayController 中删除对象,则设置为nil。虽然这会起作用,但似乎是错误的处理方法。

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

4

1 回答 1

0

我现在想出了一个办法。

我没有在问题中提到该应用程序是 MacRuby 应用程序,因为它不相关,但我不相信我已将我的解决方案完美地翻译为 Objective-C,所以我将其保留为 MacRuby .

每个 NSManagedObject 都有一个NSManagedObjectID类的 objectID,它在应用程序中唯一标识它。例如,这些可以很容易地被查询并作为 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
于 2013-02-28T19:20:25.020 回答