我用sqlite3.在xcode中创建了一个应用程序.我想在我的服务器中创建一个名为sync的按钮与我的mysql数据库同步.有关同步过程的任何建议吗?请告诉我.
你知道这是一个非常重要的问题.我去年为一个商业应用程序编写了一个库来实现这个目标,花了大约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中,BYTE是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.考虑更改标题以使搜索更友好..也许类似于:
"将SQLite客户端数据库与MySQL服务器数据库同步"