Android如何更新,但保留数据库信息

时间:2011-11-19 16:07:32

标签: java android sqlite

我有一个使用SQLite数据库的应用。当应用程序更新时,它会完全覆盖数据库。

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

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

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

感谢任何建议和帮助。

3 个答案:

答案 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。

答案 1 :(得分:3)

我同意@Yashwanth Kumar的不同设计可能长期更好,但100行不是很大。

DBhelper.onUpgrade()中实施逻辑。

您可能希望查看在更新操作发生时将答案存储在共享首选项中,同时包含它被系统/用户杀死。

答案 2 :(得分:0)

我可以在你的设计中建议一个替代方案,维护2个表,一个表示正确回答,另一个表示休息。如果问题得到正确回答,请将问题从一个表转移到已回答的问题表中。

因此,当您进行更新时,您只需删除未回答的问题表并使用新表填充它。回答的问题没有受到伤害。

相关问题