【问题标题】:Core Data Alternatives on iOSiOS 上的核心数据替代方案
【发布时间】:2011-07-21 13:36:28
【问题描述】:

我一直在使用 Core Data 开发几个 iOS 应用程序,它是一个很好的框架。但是,我遇到了一个问题,即我们或多或少地跨多个平台分发对象(同步)。 Web/数据库服务器后端和移动设备。

虽然直到现在还不是问题,但 Core Data 使用的数据模型的静态特性让我有点卡住了。基本上,所请求的是一个动态表单系统,可以在服务器上创建表单并将其传播到设备。我知道使用一组表执行此操作的技术,例如:

  • 表格表格
  • 字段表
  • Forms 表实例
  • 实例值表

只是将所有内容连接在一起。然而,我想知道的是,是否有一个替代核心数据的系统(上面直接与 SQLite 数据库对话)将允许更动态的对象图。如果有在运行时修改模式的选项,即使是标准的 ORM 也会很好。我想走这条路的主要原因是为了提高性能,因为我不希望实例值表随着条目(在本地设备或服务器上)爆炸。

我的另一个选择是在 iOS 设备上使用静态架构(对象图),但在服务器端有一个转换层,它获取正确的对象、填充属性并将其保存到正确的表中。然后,当设备开始同步时,它会执行相反的操作并将其分解为多个实例。虽然这可以避免服务器出现臃肿的实例值表,但它仍然可能是设备上的问题。

感谢任何建议。

【问题讨论】:

标签: objective-c ios core-data orm object-graph


【解决方案1】:

对表单和字段使用特定的表/实体,并为每个实例使用实体,这可能是我的建议。如果 ORM 架构会频繁发生,尝试动态操作它通常不是一个好主意。

但是,如果模式只是不经常更改,您可能可以使用 Core Data 来完成。您可以在创建NSManagedObjectContext 之前以编程方式创建和/或操作NSManagedObjectModel。您还可以创建迁移逻辑,以便在更新模型并需要重新创建上下文和存储时保留旧模型中存储的数据。

这些其他 SO 帖子可能会有所帮助:

【讨论】:

  • 啊,我正在寻找有关在运行时更改 MOM 的一些细节。感谢那些参考。实际上,我并不期望模型会频繁更改 - 但是我只是牢记应用程序的可扩展性(尤其是在移动设备上)。我从文档中猜测,一旦模型被更改(由于后台,可能会在标准执行期间发生),那么我将不得不重新加载持久存储(并迁移等)并重新初始化所有与数据库相关的内容。这是可行的,使用这种技术,我可以在平台之间共享数据模型。
【解决方案2】:

您需要仔细考虑您实际建模的内容。

您是否在建模:(1) 实际的“表单”,即 UI 元素,(2) 可能以任意数量的 UI 版本呈现的数据,例如firstName 或(3)两者?

为表单建模而设计的数据模型将具有以下实体:

Form{
  name:string
  fields<-->Field.form
}

Field{
  width:number
  height:number
  xPos:number
  yPos:number
  label:sting
  nextTab<-->Field.priorTab
  priorTab<-->Field.nextTab
  form<<-->Form.fields
}

您可以使用它来存储用户界面中显示的表单数据。然后,您将拥有一个单独的实体,并且可能还有一个单独的模型来存储将填充由第一个数据模型配置的 UI 元素的实际数据。

您可以使用 Core Data 对任何您需要了解的建模内容进行建模。

【讨论】:

  • 我将存储 UI 的信息,以及表单对象的实际数据布局。这里的主要内容是表单本身是动态的(每个客户端,后端是多租户),因此对象图会发生变化。我可以基于描述对象的固定表进行建模,也可以在运行时基于服务器动态构建对象模型。我想为每个模板使用单独的表的原因是因为我们最终可能会得到大量数据。我知道您并不是要将 Core Data 视为数据库,但必须考虑性能方面的问题。
  • 听起来您实际上可能想要基于文档的设计而不是标准的核心数据堆栈。在文档设计中,每个文档都有自己的堆栈,“文档”实际上只是一个持久存储,其中仅包含与一个逻辑文档相关的信息。在您的情况下,每个“文档”可能由两个存储组成:UI 表单的存储和表单中显示的数据的存储。如果每次都不同,则无需设计或 API 将所有这些差异塞进一个大商店。
  • 我知道这是针对 iOS 的,但请查看 MacOS NSPersistentDocument 类以了解 Core Data 如何与文档架构一起工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
相关资源
最近更新 更多