主MySQL数据库向下馈送SQLite数据库(Android)

主MySQL数据库向下馈送SQLite数据库(Android),android,mysql,sqlite,Android,Mysql,Sqlite,我们的主服务器PHP/MySQL上有一个数据库,用于存储通过网站更新的数据。我试图找出将这些数据复制到运行在android上的本地SQLite数据库的最佳方法。由于移动互联网速度等方面的限制,我需要建立检查,看看每一行是否需要更新。我认为每行的版本号可能是最好的解决方案 人们对此有何看法 谢谢, Nathan使用时间戳不是更容易吗?只需获取自特定时间以来更新的所有行。您需要复制多少数据?根据数据库的大小,可能需要一段时间 基本上,提出一个在行子集上运行MD5的查询。然后,它就像以二进制方式沿着树

我们的主服务器PHP/MySQL上有一个数据库,用于存储通过网站更新的数据。我试图找出将这些数据复制到运行在android上的本地SQLite数据库的最佳方法。由于移动互联网速度等方面的限制,我需要建立检查,看看每一行是否需要更新。我认为每行的版本号可能是最好的解决方案

人们对此有何看法

谢谢,
Nathan使用时间戳不是更容易吗?只需获取自特定时间以来更新的所有行。您需要复制多少数据?

根据数据库的大小,可能需要一段时间

基本上,提出一个在行子集上运行MD5的查询。然后,它就像以二进制方式沿着树走一样简单,跳过那些匹配的部分。步骤:

预先计算搜索的前3级左右,将其发送给客户端

在客户端上,计算这3个级别,检查匹配项。在不匹配的级别上,计算3个级别,每个不匹配的级别计算14个哈希,然后发送回服务器

在服务器上,计算接下来的3个级别,并与客户端发送的内容进行比较。计算不匹配行的下3个级别

重复2-3,直到每个限制中的行数达到1。一旦到了那里,您就已经确定了差异,所以从服务器发送/请求它们,就完成了

现在,为什么这比发送转储更有效?嗯,对于更改的1行,大约需要logtotal_行,2*sizeofMD5+2字节传输,不包括开销。因此,对于一个100万行的表,需要大约352字节的ByDirective数据来确定更改的行。现在,更改的行越多,它将使用的数据就越多

我选择了3个批次,因为这是处理额外数据和减少连接数延迟之间的一个很好的折衷

现在,对于散列行,您可以执行如下操作:

SELECT MD5(GROUP_CONCAT(row)) AS checksum FROM 
    (
       SELECT 1 AS grouping, MD5(CONCAT(id, col2, col3)) AS row 
       FROM table 
       ORDER BY id ASC
       WHERE id > ? AND id < ?
    ) AS a
    GROUP BY grouping
这将产生一个MD5,它依赖于限制中的每一行。还有其他方法,但这只是一个例子。然后用0调用它,计算行数以检查整个表,然后从那里向下迭代链

注意,这只适用于具有整数PK的表,因为它被用作二进制搜索的边界窗口。但它将以相同的速度、效率和代码检测每种类型的更改主删除、从删除、主更改、从更改、主插入、从插入