代码之家  ›  专栏  ›  技术社区  ›  Shaggy Frog

iPhone和核心数据:如何在更新之间保留用户输入的数据?

  •  5
  • Shaggy Frog  · 技术社区  · 15 年前

    考虑一个iPhone应用程序,它是一个动物目录。应用程序应该允许用户为每种动物添加自定义信息——比如说一个等级(1到5),以及一些他们可以输入的关于动物的注释。但是,用户将无法修改动物数据本身。假设应用程序更新时,(静态)目录部分应该很容易更改,但是我们希望(动态)自定义用户信息部分在更新之间保留,这样用户就不会丢失任何自定义信息。

    但是,现在棘手的部分是:我们如何以合理的方式存储(动态)用户自定义数据?

    我的第一个想法是(动态)数据库应该存储在应用程序的Documents目录中,这样应用程序更新就不会破坏现有数据。我说的对吗?

    我的第二个想法是,由于(动态)用户自定义数据数据库与(静态)动物目录不在同一个存储中,我们不能天真地在评级和注释实体(在一个数据库中)以及动物实体(在另一个数据库中)之间建立关系。在本例中,我可以想象一个解决方案是在Rating/Notes实体中有一个“animalName”字符串属性,并在运行时匹配它。这是最好的方法,还是有一种方法可以在核心数据中“同步”两个不同的数据库?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Shaggy Frog    15 年前

    基本上我就是这样解决的。

    尽管Amorya和MHarrison的答案是正确的,但他们有一个假设:一旦创建了表,不仅表,而且每个表中的每一行都将是相同的。

    问题是,我使用现有数据(定期更新)预填充“动物”数据库的过程每次都会创建一个新的数据库文件。换句话说,我不能依赖于在核心数据中创建(静态)动物实体和(动态)评级实体之间的关系,因为在下次重新生成应用程序时,该实体可能不存在。为什么不呢?因为我无法控制核心数据如何在幕后存储这种关系。因为它是一个SQLite备份存储,所以很可能它使用的是一个具有外键关系的表。但是,当您重新生成数据库时,您不能假设每一行的键值是多少。如果我在列表中添加了一只狐猴,那么第二次Lion的主键可能会有所不同。

    这个解决方案还有一个很好的副作用:我不需要处理任何迁移问题。应用程序附带的“静态”动物数据库可以作为应用程序资源嵌入。它可以改变它想要的一切。如果我修改它的数据模型以添加更多的实体,那么“动态”评级数据库在某个时候可能需要迁移,但实际上这两个数据模型是完全独立的。

        2
  •  1
  •   Amy Worrall    15 年前

    我这样做的方式是:将静态内容的数据库作为应用程序包的一部分。在应用程序启动时,检查文档中是否有数据库文件。如果没有,请将应用程序包中的一个复制到文档中。然后从文档中打开数据库:这是您从中读取和编辑的唯一数据库。

    升级后,新的静态内容需要与用户的可编辑数据库合并。每个静态项(动物,在您的例子中)都有一个名为factoryID的字段,这是一个唯一的标识符。在更新后的第一次启动时,从app bundle加载数据库,并遍历每个动物。对于每个字段,在工作数据库中找到相应的记录,并根据需要更新任何字段。

    可能有一个更快的解决方案,但由于升级过程不会经常发生,因此所花费的时间应该不会太多问题。

        3
  •  1
  •   MHarrison    15 年前

    将SQLite数据库存储在Documents目录(NSDocumentDirectory)中无疑是一个不错的选择。 一般来说,应该尽量避免应用程序更改修改或删除SQL表(添加是可以的)。然而,当您必须在更新中进行更改时,就像Amorya所说的那样,打开旧数据库,将您需要的任何内容导入新数据库,然后删除旧数据库。