在我正在处理的应用程序中,我有一个注释对象。这个音符对象可以有一个超级音符和许多子音符;基本上,我正在创建一个笔记层次结构。它的运行方式实际上与UIView非常相似。
无论如何,我需要能够保存这些数据。我使用过Core Data并了解您可以在特定对象之间创建关系,并且每个托管对象都可以具有原始属性(可转换类型除外)。但是,我不确定在一个音符,它的超级视图和它的子视图之间创建一个关系是否是最实用 - 甚至是可能的方式。
话虽如此,我想得到一些观点。如果我必须保存一系列注释,并且其中许多注释都有相互引用(与视图相同),那么最好的方法是什么?
答案 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
实体:
notes
关系:
parentNote
关系:
同样令人感兴趣的是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子类可以帮助您了解模型。