【问题标题】:How can a user add a new field to a table by creating a new attribute用户如何通过创建新属性向表中添加新字段
【发布时间】:2012-09-25 20:57:45
【问题描述】:

我是 Core Data 的新手,在我的 xCode 项目的这一部分中遇到了困难。

我创建了一个核心数据实体“Person”,该实体具有以下属性:

  • 姓名;
  • 年龄;
  • 生日;
  • 地址;

并且此属性将显示在表格视图中。到目前为止一切顺利。

我的问题是我希望表格有一个 "Add Field""Add Row" 单元格,所以当用户想要添加更多信息时这些已经创建的属性,他只需单击单元格并选择字段名称和类型。

例如,如果他想在表格的详细视图中显示此人的“电话号码”,他将新字段命名为“电话号码”并选择其类型“号码”。然后他有一个额外的字段,他可以在其中添加此人的电话号码。

如何在核心数据中做到这一点?有没有办法让用户手动向实体添加新属性并选择其格式?最好的方法是什么?谢谢。

【问题讨论】:

    标签: ios xcode core-data attributes


    【解决方案1】:

    你不能用 Core Data 做你想做的事。 Core Data 不能更改结构,除非您制作新版本的设计,但您在 xcode 中这样做。

    但您可以轻松添加另一个名为 f.ex 的表。信息,它链接到人的单个连接,并且有很多人链接回信息表。

    这样,您可以添加任意数量的字段和值,当然您添加的所有额外字段都会跟随同一个人,因此如果您要使用 cellPhone 字段,则必须将其添加到所有人。

    我建议您使用直接 SQL,而不要使用 Core Data。 Core Data 不是数据库,它是对象存储,当你在 iOS 开发方面做得更好时,你就会明白其中的区别,它比你最初想象的要大得多。

    有一个优秀的 SQLite 高级库,称为 FMDB,你可以在 github 上找到它:https://github.com/ccgus/fmdb

    在这里,您可以即时执行“Alter Table”等直接 SQL 查询等,尽管您所追求的不是很简单,但它可能是一个真正有趣的项目。

    祝你好运。

    【讨论】:

      【解决方案2】:

      我不认为这在 Core Data 中是直接可行的,因为它的目的是对象持久性,并且您不能动态地向对象添加新属性。它可以在某种程度上使用与具有namevalue(作为字符串)和data type 字段的“额外属性”实体的一对多关系来伪造。

      我相信您最好的选择是使用 SQLite 来动态修改表结构。 (http://www.sqlite.org/lang_altertable.html)

      【讨论】:

        【解决方案3】:

        我上一家公司做过这样的事情,但它并非微不足道。我无权访问代码,因此这或多或少将来自内存。

        • 您在实体中提供可转换的属性(这将是一个字典)

        • 模型对象必须为此提供 getter 和 setter,进而驱动原始方法设置/获取属性

        • 您提供一个 getter/setter,类似于 -objectForKey 和 -setObject forKey,它们读取和写入值

        • 当您被告知“错误”时,您会更新实体中的字典

        总之,维护一个键值对字典。也许您维护一个影子字典,它会根据需要进行初始化和更新。自从我上次看到这段代码以来已经有大约 4 年了,所以它有点模糊。但你应该明白这一点。这就像魔术一样——你可以任意设置任何键/值对(假设字符串键和 NSCoding 兼容的值),并且总是可以通过向字典询问其当前键集来请求键。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-04
          • 2015-08-11
          • 2016-05-03
          • 1970-01-01
          • 2011-01-10
          • 1970-01-01
          相关资源
          最近更新 更多