2011-11-19 70 views
6

我有一个使用SQLite数据库的应用程序。当应用程序更新时,它会完全覆盖数据库。Android如何更新,但保留数据库信息

当我想将用户当前进度转移到新更新时,就会出现问题。数据库表格包含多行问题。每行包含1个问题,答案,正确答案的原因,用户是否回答了问题,以及用户是否正确回答。

在更新中,问题可能已被删除和/或其他人添加。唯一需要保留的数据是如果问题已被回答并且回答正确。除了比较从旧数据库的每一行到新数据库的唯一编号或字符串之外,是否有更好的方法来传输数据?

超过100行,这似乎是非常耗费资源。虽然我看不到解决这个问题的另一种方法。

任何建议和帮助将受到感谢。

+1

答案应该对问题有参考约束。答案表有问题。然后你不能通过改变问题来打破它。 – danny117

+0

@Anene你是否尝试使用where子句的更新来删除不符合你的教条的问题? –

回答

3

我同意@Yashwanth库马尔不同的设计可能会更好,但长期来看,但100行不是很大。

DBhelper.onUpgrade()中实现逻辑。

您可能想要在更新操作发生时将查询存储在共享首选项中,并将其封装为由系统/用户杀死。

+0

感谢您的建议,您可能会向我提供有关如何将数据存储在共享首选项中的任何链接。 – Somk

+0

这是一个如此问题的例子代码,http://stackoverflow.com/questions/3624280/how-to-use-sharedpreferences-in-android-to-store-fetch-and-edit-values但是tbh google它 – scottyab

0

我可以在您的设计中提出一个替代方案,维护2个表格,一个用于正确回答,另一个用于休息。当问题得到正确回答时,将问题从一个表格转移到回答的问题表格中。

因此,当您更新时,您只需放下未答复的问题表并用新的表填充即可。回答问题的方式没有受到伤害。

+0

良好的计划唯一的问题是,在更新中,我可能会改变回答问题的内容。例如更改措辞或编辑拼写错误。这就是为什么我想出了这种方法来放弃一切,只传输用户特定的信息。 – Somk

+0

这将节省搜索的问题,这将弥补您的重新填充我猜。这只是上述事情之间的折衷。 –

6

首先分配每个表一个唯一的ID - 主键(PK)

问表 - 许多与用户
回答表一一对应关系 - 一对一与问题
关系 用户表 - 一对多的关系与问题

 
Question 
+--------------+------------+------------------+ 
| int   | Id   | PK    | 
| varchar(max) | question |     | 
| int   | userId  | FK (Foreign Key) | 
| bool   | answered |     | 
| bool   | correct |     | 
+--------------+------------+------------------+ 

Answer 
+--------------+------------+----+ 
| int   | Id   | PK | 
| int   | questionId | FK | 
| varchar(max) | reason  | | 
+--------------+------------+----+ 

User 
+---------------+-------------+--------------------------------------------+ 
| int   | Id   | PK           | 
| varchar (250) | deviceToken | (UUiD) // some unique identifier per phone | 
+---------------+-------------+--------------------------------------------+ 
// other relevant stuff 

当应用程序被下载时,用户可以使用设备UUID进行无提示注册。中央数据库将需要跟踪这些问题以及所回答的问题,而不是全部清理并重新开始。 100行不是很多,但用户可能会遇到1000或更多。在更新中,重新填充手机中的本地数据库可能会很慢(尽管这样的行数不一定会很慢,但有数百万行的数据库需要时间),因为预计更新需要时间。

如果用户更改设备,则此信息不会传输到新设备。每个设备都被视为新用户。我发现,如果您不想让人们注册,但希望在更新过程中保留数据,或者应用程序已卸载并重新安装在一台设备上,则此功能运行良好。它要求人们注册也有其局限性。如果用户想要使用相同设备重新开始游戏,则可以始终提供“重置统计数据”选项,然后清除该数据。

共享首选项也可以用来保存应用程序的用户设置,我认为这可能是过量的一百个问题,它最好适合将这些信息存储在SQLite数据库中;信息保存在服务器上。每次更新都无法擦除数据,必须保留当前消费者进度的记录。您不能依靠消费者的设备来保留这些信息。如果有任何信息需要追踪,您必须对此负责

这可以存储在手机本地并定期与服务器同步。

在我们的应用程序中,这是我们如何做到的,数据在更新中保留下来,我们拥有数百万行。随意提出更多的问题,但是给出一个实际的教程(或代码),了解这些工作对于Stack Overflow来说有点宽泛。

+0

“接受的答案表示在升级时使用数据库帮助程序,只有在数据库本身正在更改时才能使用,而不适用于不包含任何数据库更改的应用程序更新。” - 这是不正确的。欢迎您出于任何原因增加'SQLiteOpenHelper'使用的模式版本。 – CommonsWare

+0

@CommonsWare删除了该部分,并感谢您的反馈。 –

+0

@CommonsWare在没有数据库模式更改的情况下实现它会有什么意义? –