我在这里经历了其他类似性质的问题,但它们都与在应用程序更新中替换以前的sqlite数据库有关。我一直在为所有以前的应用程序执行此操作,因为它们本质上是引用性的,并且只需替换即可。
我正在使用的这个特定应用是一个测验游戏,需要保持分数。目前共有4个级别,大约有15个问题,以后更新时可能会增加。由于我以前从未做过此事,所以我很好奇,并打算第一次以正确的方式来做。所以这是我的查询:
PS。我将数据库复制到Documents目录,因此它在应用程序更新时仍然存在。
编辑:我应该补充说,测验应用程序是一种“徽标测验”副本,其中所有问题的分数(或将被回答/未回答的问题状态)都需要维护。因此,第一个版本中有60个问题,随着用户回答它们的状态也会改变。
编辑2:这是我最关心的表,问题表的结构:
_id(整数,主键),levelId(整数),QuestionImage(Varchar),CorrectAnswer(Varchar),boolAnsweredCorrectly(Integer)。
测验就像徽标测验。有一张图片,用户必须输入答案。如果键入的答案与数据库中的正确答案匹配,则boolAnsweredCorrectly设置为true。我主要关心的是boolAnsweredCorrectly(根据结果为0或1)。
编辑3:当我谈到在应用程序更新时插入数据时,我是说这句话。假设第一版中有60个问题。在第二个版本中,添加了40个新问题。因此,当用户将应用更新为第二版时,需要将新的40个问题插入问题表中。添加方式应使前60个问题不被弄乱并保持完整。
最佳答案
SO专家推荐的更新内容的首选方法是什么?是否具有版本号(也许在数据库本身中),并且在首次运行新应用程序时,会将新内容插入表中?
取决于您是否仅使用数据库来存储此人的答案的结果(在这种情况下,您可能不需要在表中做任何“插入”操作,而不必在发生时存储该人的测验答案)。是否还有一些单独的表存储原始问题(如果您不通过某些服务器界面发送新问题,这可能很有意义)。
我个人使用database_version
表中的configuration
字段,格式为“major
。minor
。revision
”,其中major
或minor
假定需要进行数据库更新的数据库更改,而revision
更改则不需要)。但是我使用此数据库版本号系统来知道是否要将捆绑包的数据库重新复制到Documents
中(但是我这样做仅是为了对数据库进行结构更改,并且更愿意通过服务器接口获取新数据,但这取决于如何您设计的解决方案)。如果您以编程方式确定要再次复制数据库,但是如果需要保留任何数据(直到Retterdesdialogs),您可能希望将任何数据从旧数据库保存到新数据库中。
存储插入查询的首选方式是什么?是否应该在实现文件中对它们进行硬编码?
无论如何,我认为您不应该有大量的硬编码INSERT
语句,因此这不是问题。我从下面的评论中收集到,您期望根据用户以前的版本尝试插入新的问题记录。
就个人而言,我更倾向于
Documents
数据库版本的版本Documents
; (c)根据旧数据库的答案更新新数据库中的答案。 您当然可以通过编程方式插入记录,但是想像一下当您进入应用程序的第20版时,生活会是什么样子,并且您将不得不基于之前版本的应用程序对要插入的内容具有大量的条件逻辑。应用程式原为(因为您无法假设使用者将永远拥有旧版本...可能是过时的几个版本)。当您将每个版本都考虑为添加,删除和修改问题的组合时,它将变得更加毛茸茸。
最重要的是,我倾向于使用当前问题的数据库,如果需要的话,将其复制到
Documents
,只需确保应用程序具有包含旧答案的旧数据库,然后手动保存它们即可。 (或者您可以将答案存储在单独的数据库中。)另外,我怀疑这超出了您的期望,但您可能要考虑使用 Core Data (首选的iOS持久存储模型)。看来它已经解决了Core Data Model Versioning and Data Migration中概述的迁移问题。我从未使用过Core Data的迁移/版本化工具(从历史上看,我一直都在自己开发),但是看起来很有希望。
关于iphone - 将内容更新/插入到iPhone应用程序更新上的现有Sqlite数据库中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12084989/