2009-06-22 192 views
7

我已经创建了一个应用程序在xcode与sqlite3.I想创建一个名为同步的按钮来与我的服务器中的MySQL数据库同步。任何有关同步过程的建议?请告诉我。同步SQLite客户端数据库与MySQL服务器数据库

+0

你是否愿意同步创建表的下落? – Macarse 2009-06-22 07:04:46

+0

是的...这意味着我想与服务器同步,每当我需要它...通过无线交易不连接iPhone到PC – user123589 2009-06-22 10:30:53

回答

4

使用服务器上的web服务返回模式版本号和上次更新的时间戳。如果客户端已过期,则会进行第二次调用以获取更新的模式和/或新数据。

3

我相信你是说你在一台计算机上运行MySql服务器,并且你正在运行一个带有sqlite实例的应用程序,并且如果MySql服务器上有新数据,你想更新sqlite服务器。

我会做这样

1)确保你的计算机上,并在应用程序中的表具有相同的结构。包括最后一次更新的字段

2)要检查谁是最新的,请通过您的唯一密钥获取最后一行,然后比较更新的字段。

3)当最新的字段属于服务器,然后找出有多少行是不同的,并开始复制它们在do ... while()循环或不管你喜欢。

如果您在服务器和客户端上都实现此代码,那么他们可以互相更新,或者您更喜欢只更新客户端。

细节取决于您要使用的语言以及您希望投入开发的时间。

0

几个问题:

  • 您是否试图双向同步,或从服务器只需拔更新?
  • 哪些更新操作可以接受?插入/更新/删除?在复制数据库中,通常会避免删除。

如果您只需要从服务器拉取插入/更新,您可以创建一个PHP脚本,它将返回要执行的SQLite语句。 php脚本将从客户端获取最后更新序列/时间的参数。

如果你打算做双向同步,那么你必须考虑合并和冲突解决。对于双方来说,最好是每一方都有一个事务队列。只需记录针对数据库执行的每条CRUD语句。同步时,应用这些语句,然后截断队列。

8

你意识到这是一个不平凡的问题。我去年为一个商业应用程序编写了一个库来完成这个工作,花了大约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中)

0

SQuirreL SQL“与MySQL服务器数据库同步一个SQLite客户端数据库”拥有DBCOPY插件它。可以使用它编写数据库副本。我没有尝试过,但那是我要走的第一个方向。

相关问题