【问题标题】:How to dynamically generate CoreData objects如何动态生成CoreData对象
【发布时间】:2013-02-24 10:47:28
【问题描述】:

我没有在文档/讨论中找到明确的“否”,但怀疑无法在运行时以编程方式生成 CoreData 对象。

我想做的类似于从运行代码中执行 DDL 命令(例如“创建表”、“删除表”等),因为我不知道直到我询问用户他的表有多少列需要,或者他们需要什么数据类型。也许他需要多张桌子。

有人知道这是否可能吗?希望有一个指向要阅读的东西的指针。 (也很感激学习负面的,所以我可以停止怀疑。)

如果在 CoreData 中不可行,这会是切换到 SQLite 的理由吗?

【问题讨论】:

  • 您可以在运行时创建 Core Data“托管对象模型”和“实体描述”(示例参见 stackoverflow.com/a/13744302/1187415)。但请注意,Core Data 是一个“对象图管理器”,而不是数据库(参见例如cocoawithlove.com/2010/02/…)。因此,对于 Core Data,您应该考虑对象及其属性和关系,而不是表。
  • 我完全同意@MartinR ;)
  • 非常感谢。我会研究参考。我刚才也遇到了stackoverflow.com/questions/6379025/…,好像在同一个区域(发现有点晚了,抱歉:-))
  • 看起来我可以动态创建 CoreData 对象,但必须将它们分配给一个必须在运行时之前定义的类(实际上,如何使用属性)。所以我想我不能真正使用在运行时完全组成的 CoreData 对象(和关联的类)。我想我必须在 CoreData 对象之上实现我自己的动态实体属性数据模型。这会让我很困惑。感谢您提供上述信息。
  • 您不必创建或分配课程。默认情况下,它们将是 NSManagedObject 实例——要获取你放在实体上的属性,只需使用键值编码 ... [thing valueForKey:@"stuff"], [thing setValue:@"other" forKey:@"stuff];

标签: ios xcode core-data


【解决方案1】:

您可以在运行时创建整个 Core Data 模型——根本不需要使用 Xcode 的数据建模器,并且 API 支持创建和配置模型的每个细节。但它可能不像你想要的那样灵活。尽管您可以创建新的实体描述或修改现有的描述,但您只能在加载数据存储文件之前这样做。读取和写入数据后,您必须将数据模型视为固定的。此时更改它会产生异常。

这与典型的 SQLite 用法不太一样。这有点像 SQLite 表是在一个文件中定义的,而数据存储在另一个文件中——您可以动态修改表,但只能在加载实际数据之前进行。 (我知道这不是 SQLite 真正的工作方式,但这基本上是 Core Data 强制执行的方法)。

如果您希望按照您的描述修改您的模型/架构,那么直接使用 SQLite 访问可能会更好。有几个 Objective-C SQLite 包装器允许使用 ObjC 风格的方法,同时仍然支持 SQLite 风格的访问:

【讨论】:

  • 谢谢。这很有帮助。我想我想要实现的可以描述为图形数据库前端,适用于没有(也不想要任何)数据库经验的人。您的回复证实了我的印象。再次感谢。
  • 托管对象模型启动并运行后,您可以复制它并修改该副本,然后切换到使用新模型——全部在运行时进行。
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2021-09-07
  • 2016-04-30
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
相关资源
最近更新 更多