2

我在这里遇到了类似性质的其他问题,但它们都与在应用程序更新时替换以前的 sqlite db 有关。我一直在为所有以前的应用程序这样做,因为它们本质上是参考的,并且一个简单的替换就足够了。

我正在使用的这个特定应用程序是一个问答游戏,需要保持分数。目前有 4 个级别,大约 15 个问题,在以后的更新中,这些可能会增加。由于我以前从未这样做过,我很好奇并打算第一次以正确的方式做到这一点。所以这是我的疑问:

  1. 更新 SO 大师推荐的内容的首选方式是什么?是否有版本号(可能在数据库本身中)并且在新应用程序首次运行时,新内容被插入到表中?
  2. 存储插入查询的首选方式是什么?它们是否应该在实现文件中硬编码?

PS。我将数据库复制到 Documents 目录,因此它会在应用程序更新时持续存在。

编辑:我应该补充一点,测验应用程序是一种“徽标测验”副本,其中需要维护所有问题的分数(或将被回答/未回答的问题的状态)。所以第一个版本有 60 个问题,它们的状态会随着用户的回答而改变。

编辑2:这是我最关心的表的结构,问题表:

_id (Integer, PRIMARY Key), levelId (Integer), QuestionImage (Varchar), CorrectAnswer(Varchar), boolAnsweredCorrectly(Integer)。

测验就像徽标测验。有一张图片,用户必须输入答案。如果键入的答案与 DB 中的正确答案匹配,则 boolAnsweredCorrectly 设置为 true。我主要关心的是 boolAnsweredCorrectly (根据结果为 0 或 1)。

编辑 3:当我谈到在应用程序更新时插入数据时,我的意思是这个。假设第一个版本有 60 个问题。在第二个版本中增加了 40 个新问题。因此,当用户将应用程序更新到第二个版本时,需要将新的 40 个问题插入问题表中。这是以这样的方式添加的,即之前的 60 个问题不会被弄乱并保持完整。

4

2 回答 2

2

更新 SO 大师推荐的内容的首选方式是什么?是否有版本号(可能在数据库本身中)并且在新应用程序首次运行时,新内容被插入到表中?

取决于您是否仅使用数据库来存储该人的答案结果(在这种情况下,您可能不需要在表中执行任何“插入”操作,除了在他们发生时存储该人的测验答案)或您是否也有一些单独的表格来存储原始问题(如果您不通过某些服务器界面提供新问题,这可能是有意义的)。

我个人在表格中使用格式为“ . . ”的database_version字段,其中或预设需要数据库更新的数据库更改,而更改不需要)。但是我使用这个数据库版本号系统来知道我是否想将我的包的数据库重新复制到(但我这样做只是为了对我的数据库进行结构更改,并且更喜欢通过服务器接口获取新数据,但这取决于你如何解决方案设计)。如果您确实以编程方式确定要再次复制数据库,如果您有任何需要保留的数据,但对于 Retterdesdialogs 而言,您可能希望将旧数据库中的任何数据保存到新数据库中。configurationmajorminorrevisionmajorminorrevisionDocuments

存储插入查询的首选方式是什么?它们是否应该在实现文件中硬编码?

无论如何,我认为你不应该有大量的硬编码INSERT语句,所以这不是问题。我从您下面的评论中得知,您预计会尝试根据用户以前拥有的版本插入新的问题记录。

就个人而言,我更倾向于

  • 将您最新和最重要的问题放在捆绑包中的数据库中
  • Documents让应用程序根据应用程序的预期检查数据库版本的版本,
  • 如果不同 (a) 保存用户的旧答案;(b) 将新数据库从捆绑包复制到Documents;(c) 根据旧数据库的答案更新新数据库中的答案。

您当然可以以编程方式插入记录,但想象一下,当您的应用程序发布到第 20 版时,您的生活会是什么样子,您将不得不有大量的条件逻辑来确定要插入的内容,具体取决于之前版本的内容。 app 是(因为你不能假设用户总是拥有以前的版本......他们可能有几个版本过时了)。当您考虑每个版本都是添加、删除和修改问题的组合时,它会变得更加棘手。

底线,我倾向于当前问题的数据库,Documents如果需要,将其复制到,只需确保应用程序有旧数据库和旧答案,然后手动保存它们。(或者您可以将答案存储在单独的数据库中。)

或者,我怀疑这不是您想要的,但您可能需要考虑使用Core Data,这是首选的 iOS 持久存储模型。似乎它已经解决了核心数据模型版本控制和数据迁移中概述的迁移问题。我从来没有使用过 Core Data 的迁移/版本控制的东西(我历来都是自己推出的),但它看起来很有希望。

于 2012-08-23T08:00:24.297 回答
1

我会在伪代码中做这样的事情:

// if old database exists in documents directory
// get scores
// delete old database
// copy the new database from bundle to documents directory
// update scores in the new database

要检查旧数据库是否是旧数据库,您可以检查名称或 somthink,例如“is questions == 15”

于 2012-08-23T07:22:54.830 回答