在iOS中保存对象引用的最有效方法?

时间:2013-11-22 00:02:41

标签: objective-c core-data hierarchy

在我正在处理的应用程序中,我有一个注释对象。这个音符对象可以有一个超级音符和许多子音符;基本上,我正在创建一个笔记层次结构。它的运行方式实际上与UIView非常相似。

无论如何,我需要能够保存这些数据。我使用过Core Data并了解您可以在特定对象之间创建关系,并且每个托管对象都可以具有原始属性(可转换类型除外)。但是,我不确定在一个音符,它的超级视图和它的子视图之间创建一个关系是否是最实用 - 甚至是可能的方式。

话虽如此,我想得到一些观点。如果我必须保存一系列注释,并且其中许多注释都有相互引用(与视图相同),那么最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

我将如何做到这一点:

1)使用Core Data和(可选)Mogenerator。特别是当你的应用程序的功能不断增长时,你会很高兴你做到了。

2)在数据模型中创建一个Note实体。

3)在Note实体上,创建一个名为notes的多对多关系,使用反向指向Note自身)一对一的关系,称为parentNote。所以,你会有这样的双向关系:

parentNote<< ---> notes(意思是:一个parentNote和一个或多个notes

兴趣点

正如您所提到的,UIView做了与此非常相似的事情。基本上,每个UIView都有一个subviews数组,每个subview引用其父视图superview。因此,您在每个UIView上都有这种双向关系:

superview<< ---> subviews

每个请求的屏幕截图:

仅显示关系的

Note实体:

enter image description here

notes关系:

enter image description here

parentNote关系:

enter image description here

同样令人感兴趣的是delete rules - 我建议您在cascade上设置notes,在nullify关系设置parentNote(这意味着parentNote 拥有其子级notes,因此当它被删除时,它们也是如此)。但是,请确保这是您想要的行为。

答案 1 :(得分:0)

您需要区分Core Data Note实体和视图。因此,通常您不会在Note(我假设这是Core Data Note对象或记录)及其超级和子视图之间创建关系。

您的MODEL表示Notes(包含文本和/或图像)之间的关系,如果它是层次结构,那么Note可以有子项和父项。如果它更复杂,因为你想在层次结构的不同分支上链接Notes,那么你需要另一个linkedNotes关系。

我有几个应用程序执行前者(维护富文本注释的层次结构加上一些数据字段) - 请参阅显示文件夹和文档层次结构的屏幕截图(使用相同的核心数据实体进行持久化,并指示单个标记如果它是一个文件夹,如果它不是一个文件夹,它不能有子项,但这不是由数据库强制执行的,它在应用程序逻辑中强制实施)。下面的层次结构是无限的,Core Data维护这些引用,nil parent表示它的根节点。

关于实际显示每个音符的视图,这取决于您尝试做什么。在下面的应用程序中,有两个视图,一个显示文档的层次结构,另一个显示所选文档的详细信息。层次结构允许用户可以拖放项目或整个分支(项目)或将它们复制并粘贴到另一个文档或部分,详细信息视图允许编辑项目。

与UI关联的app逻辑管理由于这些用户操作而维护Core Data对象之间的关系状态。但是,Core Data用于保存状态,包括是否扩展文件夹。

还有另一个iOS应用程序使用这个完全相同的文档(核心数据存储)在iPad或iPhone上显示相同的信息(使用不同的视图,具体取决于设备和设备的方向)。在iOS上使用不同的UI控件(UITableView)完成导航层次结构,但同样可以在层次结构中移动对象,并且Core Data会维护和保持关系中的关联更改。通过iCloud同步,任何此类更改都会复制到运行相同应用程序的其他设备,并且这些更改会在Core Data导入后通过接收设备上的UI反映出来。

这是保存对象引用和维护关系的最有效方法,我的猜测是肯定的,因为已经为您完成了很多与UI控件的集成,您可以获得跨平台支持并获得iCloud集成。

编辑: 如果您认为这是您想要做的事情,很高兴发布一些代码示例。核心数据模型和NSManagedObject子类可以帮助您了解模型。

enter image description here

enter image description here