同步SQLite客户端数据库与MySQL服务器数据库
我已经创建了一个应用程序在xcode与sqlite3.I想创建一个名为同步的按钮来与我的服务器中的MySQL数据库同步。任何有关同步过程的建议?请告诉我。同步SQLite客户端数据库与MySQL服务器数据库
使用服务器上的web服务返回模式版本号和上次更新的时间戳。如果客户端已过期,则会进行第二次调用以获取更新的模式和/或新数据。
我相信你是说你在一台计算机上运行MySql服务器,并且你正在运行一个带有sqlite实例的应用程序,并且如果MySql服务器上有新数据,你想更新sqlite服务器。
我会做这样
1)确保你的计算机上,并在应用程序中的表具有相同的结构。包括最后一次更新的字段
2)要检查谁是最新的,请通过您的唯一密钥获取最后一行,然后比较更新的字段。
3)当最新的字段属于服务器,然后找出有多少行是不同的,并开始复制它们在do ... while()循环或不管你喜欢。
如果您在服务器和客户端上都实现此代码,那么他们可以互相更新,或者您更喜欢只更新客户端。
细节取决于您要使用的语言以及您希望投入开发的时间。
几个问题:
- 您是否试图双向同步,或从服务器只需拔更新?
- 哪些更新操作可以接受?插入/更新/删除?在复制数据库中,通常会避免删除。
如果您只需要从服务器拉取插入/更新,您可以创建一个PHP脚本,它将返回要执行的SQLite语句。 php脚本将从客户端获取最后更新序列/时间的参数。
如果你打算做双向同步,那么你必须考虑合并和冲突解决。对于双方来说,最好是每一方都有一个事务队列。只需记录针对数据库执行的每条CRUD语句。同步时,应用这些语句,然后截断队列。
你意识到这是一个不平凡的问题。我去年为一个商业应用程序编写了一个库来完成这个工作,花了大约6个月的时间才把它带到了我对它感到满意的地方。
撇开使用端口80和HTTP(TCP/IP)以避免防火墙和支持问题的争论,您需要设计一个协议。由于我的项目是非常数据敏感,我去了一个二进制协议(而不是臃肿的XML),可以处理任何数据。我也希望它是双向的,以便我可以插入数据以及执行请求。我在服务器上使用了CGI/FastCGI。
我设计的二进制协议非常简单(总是更好),并将大量传输分成用户定义大小的块(大约600k似乎很好)。每个块都有一个标题,后跟数据。
虽然此协议可用于传输任何类型的数据,但通常用于数据库样式数据,正如您的问题所暗示的那样。为了证明这一点,我决定使用行/列的方法来设计。数据一次存储一行,这意味着每个列存储第一行,然后存储第二行...第n行的所有列。
单个列中的数据的格式是:
' Col1Type 1Bytes - BYTE ' Data Type (REMSQL_TEXT etc)
' Col1Len 4Bytes - DWORD ' Length in bytes the Column Data - up to 4.2GB
' Col1Data nBytes - BYTE ' String data
(在C,一个字节是CHAR)
这意味着,每列具有数据类型描述符。
REMSQL_NONE = 0 ' DataType undefined
REMSQL_QUAD = 1 ' 64-bit signed integer
REMSQL_DBLE = 2 ' 64-bit IEEE floating point number
REMSQL_TEXT = 3 ' STRING - (CHAR) string of Ascii Bytes
REMSQL_BLOB = 4 ' BLOB - (CHAR) string of Binary Bytes
REMSQL_NULL = 5 ' NULL - Empty Column
这些数据类型共前前后后使用SQLite基本数据类型和在数值上等同于SQL3基本数据类型枚举:所有的数据类型可以用来表示。
在这个设计中,如果一个字段为空(NULL),那么你只需要5个字节来存储它。例如,如果一个字段有200个字节的文本,则只需要205个字节来存储它。更大的好处是解析数据,因为跳过列可以在不读取所有200个字节的情况下完成,找到一些终止字符。
Chunk标题应该包含诸如行数,列数,总字节数等等等等。如果使用DWORD(无符号64位整数),那么块的理论限制是4.2gig,它应该足以满足本地网络传输。
该实现需要为此功能编写SQLite/MYSQL包装器。我只使用BINARY协议,这需要一点时间,但您基本上需要以下功能: 客户端:SendRequest() - 发送请求,等待响应
服务器端:ProcessRequest() - 接收请求,进程它并返回响应
在我的情况下,响应可以是!00MB或更多的数据。我从MySQL检索整个数据集并将其保存到服务器上的磁盘中。然后我返回一个包含数据集指标的空白块。然后,客户端逐个请求以600k为单位的数据集。如果连接丢失,它只会从停止的地方开始。
最后,数据集主要是文本(名称地址等),以便压缩。在这种情况下,安全性是一个非常大的问题,所以加密非常重要这确实会稍微复杂一些,但基本上你会压缩整个块,填充到块密码BLOCKSIZE的倍数并对其进行加密。
在这一切的过程中,我写一个非常快的字符串生成器类,在ASM AES加密的实现,整个FastCGI的库(www.coastrd.com)
所以,正如我说的,不平凡。我将很快提供这个图书馆。如果你想看看,给我发电子邮件。
一旦你写好通讯,你就可以开始设计同步。我要么为每个记录使用散列,要么使用简单的布尔标志。如果服务器上有任何更改,只需发送整个记录并在客户端覆盖它(假设您正在尝试使客户端保持同步...)
如果您自己编写,请在此发布有关您的体验!
PS。考虑更改标题,以更友好的搜索..也许是这样的:
(使用Hibernate在Java中)
你是否愿意同步创建表的下落? – Macarse 2009-06-22 07:04:46
是的...这意味着我想与服务器同步,每当我需要它...通过无线交易不连接iPhone到PC – user123589 2009-06-22 10:30:53