更新/将内容插入iPhone应用程序更新中的现有Sqlite数据库

我已经经历了类似的性质的其他问题,但他们都与更新应用程序更新之前的SQLite数据库有关。 我一直在为以前的所有应用程序做这件事,因为它们本质上是指代性的,而且一个简单的replace就足够了。

我正在使用的这个特定的应用程序是一个测验游戏,分数需要保持。 目前共有四个级别,共有十五个问题,稍后更新可能会增加。 由于我从来没有这样做过,所以我很好奇,打算第一次以正确的方式做到这一点。 所以这里是我的查询:

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

PS。 我将数据库复制到Documents目录,所以它保持应用程序更新。

编辑:我应该补充说,测验应用程序是一种“标识测验”复制品,其中所有问题的得分(或将回答/未答复的问题的状态)需要保持。 所以在第一个版本中有60个问题,并且随着用户回答他们的状态被改变。

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

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

测验就像Logos Quiz。 有一个图像,用户必须键入答案。 如果input的答案与DB中的correctanswer匹配,则boolAnsweredCorrectly设置为true。 我主要关心的是boolAnsweredCorrectly(根据结果可能是0或1)。

编辑3:当我说插入数据更新的应用程序,我的意思是这个。 假设第一个版本有60个问题。 在第二个版本中增加了40个新的问题。 所以,当用户将应用程序更新到第二个版本时,需要将新的40个问题插入到问题表中。 这是为了使以前的60个问题不会混淆并保持不变。

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

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

我个人在configuration表中使用了一个database_version字段,其格式为“ major . minor ”,其中majorminor前提是需要数据库更新的数据库更改,而revision更改则不会)。 但是我使用这个数据库版本号系统来知道我是否想要将我的数据库的数据库重新复制到Documents (但是我这样做只是对数据库进行结构性更改,而更喜欢通过服务器接口获取新数据,但这取决于如何你的解决scheme是devise的)。 如果以编程方式确定要再次复制数据库,但是如果您有任何需要保留的数据,对于Retterdesdialogs来说,您可能希望将旧数据库中的所有数据保存到新数据库中。

什么是存储插入查询的首选方法? 他们应该在一个实现文件中硬编码吗?

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

就我个人而言,我更倾向于

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

你当然可以通过编程的方式插入logging,但是想象一下,当你到达第20版的时候,生活将会是什么样的,你将不得不根据以前的版本应用程序是(因为你不能假设用户将永远有以前的版本…他们可能是过时的几个版本)。 当你想到每个版本都是增加,删除和修改问题的组合时,它会变得更加复杂。

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

或者,我怀疑这比你想咬人更多,但是你可能要考虑使用首选的iOS持久存储模型Core Data 。 看起来,它已经解决了这个迁移问题,如核心数据模型版本控制和数据迁移中所述 。 我从来没有使用Core Data的迁移/版本(我历来一直在推出自己的),但它看起来很有前途。

我会用伪代码来做这样的事情:

 // 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”