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

Som*_*omk 6 java sqlite android

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

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

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

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

我们将非常感激地提出任何建议和帮助.

Yve*_*omb 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.


sco*_*yab 3

我同意@Yashwanth Kumar 的观点,从长远来看,不同的设计可能会更好,但 100 行并不是很大。

在DBhelper.onUpgrade()中实现逻辑。

您可能希望在更新操作发生时将答案存储在共享首选项中,以防它被系统/用户终止。