掌握SQLite数据库的主MySQL数据库(Android)

时间:2011-02-15 21:01:14

标签: android mysql sqlite

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

人们对此有何看法?

谢谢, 森

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

根据数据库的大小,binary search可能值得。

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

  1. 预先计算搜索的前3个级别(或左右),将其发送给客户端。

  2. 在客户端上,计算这3个级别,检查匹配项。在那些不匹配的计算中,计算3个级别(每个非匹配级别3个14个哈希值)并发送回服务器。

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

  4. 重复2-3,直到每个限制中的行数达到1。在那之后,您已经确定了差异,因此从服务器发送/请求它们,您就完成了。

  5. 现在,为什么这比发送转储更有效?好吧,对于1行更改,将转换大约log(total_rows, 2) * (sizeofMD5 + 2)个字节(不包括开销)。因此,对于100万行表,它将需要大约352字节的方向数据来确定更改的行。现在,更改的行越多,它将使用的数据就越多。

    我选择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, count(rows)调用它来检查整个表格,然后从那里迭代链。

    请注意,这仅适用于具有整数PK的表(因为它用作二分查找的边界窗口)。但它会以相同的速度,效率和代码检测每种类型的更改(主 - 删除,从 - 删除,主 - 更改,从 - 更改,主 - 插入,从 - 插入)。