我在这里遇到了类似性质的其他问题,但它们都与更新以前的sqlite数据库更新有关。我一直在为所有以前的应用程序做这个,因为它们本质上是参考,并且简单的替换就足够了。
我正在使用的这个特殊应用是一个问答游戏,需要保持得分。目前有4个级别,大约15个问题,在稍后的更新中,这些可能会增加。由于我以前从未这样做过,所以我很好奇,并打算第一次以正确的方式做到这一点。所以这是我的疑问:
PS。我将数据库复制到Documents目录,因此它会持续存在于应用程序更新中。
编辑:我应该补充一点,测验应用程序是一种“徽标测验”副本,其中需要维护所有问题的分数(或将回答/未答复的问题的状态)。因此,第一个版本中有60个问题,并且当用户回答它们时,它们的状态会发生变化。
编辑2:这是我最关心的表格的结构,问题表:
_id(整数,PRIMARY键),levelId(整数),QuestionImage(Varchar),CorrectAnswer(Varchar),boolAnsweredCorrectly(整数)。
测验就像Logos Quiz。有一个图像,用户必须输入答案。如果输入的答案与DB中的correctanswer匹配,则boolAnsweredCorrectly设置为true。我主要担心的是boolAnsweredCorrectly(根据结果,它将是0或1)。
编辑3:当我谈到在更新应用程序时插入数据时,我的意思是这个。假设第一个版本中有60个问题。在第二个版本中,添加了40个新问题。因此,当用户将应用程序更新到第二个版本时,需要将新的40个问题插入到问题表中。这是以前60个问题没有搞砸并保持不变的方式添加的。
答案 0 :(得分:2)
更新SO大师推荐的内容的首选方法是什么?它是否具有版本号(可能在数据库本身中),并且在首次运行新应用程序时,新内容将插入到表中?
取决于您是否仅使用数据库来存储人员答案的结果(在这种情况下,除了存储人员的测验答案之外,您可能不需要“插入”表格。发生)或者你是否有一些单独的表存储原始问题(如果你没有通过某个服务器接口提供新问题,这可能是有意义的。)
我个人在database_version
表格中使用configuration
字段,格式为“major
。minor
。revision
”,其中{{1}或major
预先假定需要数据库更新的数据库更改,而minor
更改则不这样做。但我使用这个数据库版本号系统来知道我是否要将我的数据库的数据库重新复制到revision
中(但我这样做只是为了对我的数据库进行结构更改,并且更喜欢通过服务器接口获取新数据,但是这取决于您的解决方案的设计方式)。如果您以编程方式确定要再次复制数据库,如果您有任何需要保留的数据,但是,对于Retterdesdialogs而言,您可能希望将旧数据库中的任何数据保存到新数据库中。
存储插入查询的首选方法是什么?它们应该在实现文件中进行硬编码吗?
我认为你不应该有大量的硬编码Documents
声明,所以这不是问题。我从下面的评论中收集到您预计会尝试根据用户以前使用的版本插入新的问题记录。
就个人而言,我更倾向于
INSERT
数据库版本的版本,Documents
; (c)根据旧数据库的答案更新新数据库中的答案。你当然可以通过编程方式插入记录,但想象一下当你进入应用程序的第20版时生活会是什么样的,你必须根据先前的内容有大量关于插入内容的条件逻辑该应用程序的版本是(因为你不能假设用户将始终拥有以前的版本......他们可能是过时的几个版本)。当你考虑每个版本是添加,删除和修改问题的组合时,它会变得更加毛茸茸。
总而言之,我倾向于使用当前问题的数据库,如果必须,将其复制到Documents
,只需确定应用程序是否具有旧答案的旧数据库,然后手动保留它们。 (或者您可以将答案存储在单独的数据库中。)
或者,我怀疑这不仅仅是你想要咬人,但你可能想考虑使用核心数据,这是首选的iOS持久存储模型。它似乎已经解决了Core Data Model Versioning and Data Migration中概述的迁移问题。我从来没有使用过Core Data的迁移/版本化的东西(我以前一直都是自己的),但看起来很有希望。
答案 1 :(得分: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”