将 SQLite 客户端数据库与 MySQL 服务器数据库同步

2024-03-07

我已经在 xcode 中使用 sqlite3 创建了一个应用程序。我想创建一个名为sync 的按钮来与我的服务器中的 mysql 数据库同步。关于同步过程有什么建议吗?请告诉我。


好吧,您意识到这是一个不小的问题。去年,我为一个商业应用程序编写了一个库来完成此任务,花了大约 6 个月的时间才达到我满意的程度。

抛开使用端口 80 和 HTTP (TCP/IP) 以避免防火墙和支持问题的争论不谈,您需要设计一个协议。由于我的项目数据非常密集,所以我使用了可以处理任何数据的二进制协议(而不是臃肿的 xml)。我还希望它是双向的,以便我可以插入数据并执行请求。我在服务器上使用了CGI/FastCGI。

我设计的二进制协议非常简单(总是更好),并将大型传输分成用户定义大小的块(大约 600k 似乎不错)。每个块都有一个标头,后面跟着数据。

尽管此协议可用于传输任何类型的数据,但正如您的问题所示,它通常用于数据库样式数据。为了适应这一点,我决定使用行/列方法进行设计。数据一次存储一行,这意味着第一行的每一列都存储,然后第 2 行...第 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)

正如我所说,这并非微不足道。我将很快提供这个库。如果您想查看,请给我发电子邮件。

编写完通信后,您就可以开始设计同步。我要么对每个记录使用哈希值,要么使用简单的布尔标志。如果服务器上有任何更改,只需发送整个记录并在客户端覆盖它(假设您试图保持客户端同步......)

如果您自己写,请在这里回复您的经验!

附言。考虑更改标题以使其更易于搜索。也许类似:

“同步 SQLite 客户端数据库与 MySQL 服务器数据库”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 SQLite 客户端数据库与 MySQL 服务器数据库同步 的相关文章

  • 如何优化这个查询(涉及4毫米表)

    我正在使用如下所示的遗留数据库架构 product table表有字段 uid 整数 主键 name varchar 50 category表有字段 uid 整数 主键 name varchar 50 好吧 现在product table与
  • 将蒙版图像作为 PNG 文件写入磁盘

    基本上 我从网络服务器下载图像 然后将它们缓存到磁盘上 但在这样做之前 我想屏蔽它们 我正在使用每个人似乎都指出的屏蔽代码 可以在这里找到 http iosdevelopertips com cocoa how to mask an ima
  • 需要 SQL 选择查询帮助

    我的问题类似于SQL选择组查询 https stackoverflow com questions 11407601 sql select group query 但模式发生了变化 我想要不同的结果 如下所述 给定链接的解决方案没有给我正确
  • 动态表单字段验证的数据库设计

    在我的应用程序中 我允许用户创建一个包含他们想要的任何 HTML 表单字段 例如文本输入 文本区域 选择等 的表单 我想让用户能够为每个字段定义 0 个或多个累积验证规则 最多可能有 25 个不同的验证规则 我应该如何建模 这是一个潜在的解
  • iOS 6 中捕捉全景的库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在iOS中有很多方法和库来显示全景图片 虽然内置相机中有全景功能 但无法在应用程序中使用它 有没有可以用来捕获全景图像的库 Thanks
  • UTF-8、PHP 和 XML Mysql

    我在解决这个问题时遇到了很大的问题 我有一个编码 latin1 swedish ci 的 mysql 数据库和一个存储名称和地址的表 我正在尝试输出 UTF 8 XML 文件 但在使用以下字符串时遇到问题 Otiv gen它被输出为Otiv
  • 无法将外键值插入链接表

    我目前正在尝试将数据插入名为的表中 客户报价 该表充当 顾客 表和 客户关税 桌子 它还记录通过以下方式提交数据的用户 user table 这是我的数据库的架构 https i stack imgur com gyCdb png http
  • 强制变量声明的协议 - Objective C

    是否可以在 protocol中声明变量 只是为了强制程序员在实现类 实现此协议的类 标头和实现中添加这些变量 Thanks 简短回答 不 不可能那样做 您最多可以强制方法和属性的可用性
  • mysql错误1442的真正原因是什么?

    好吧 我在互联网上寻找了很多地方来寻找原因mysql error 1442其中说 无法更新存储函数 触发器中的表 unlucky table 因为 它已被调用此存储的语句使用 功能 触发器 有人说这是 mysql 中的一个错误或者它不提供的
  • MySql 5.7 函数 UUID() 默认排序规则 - 非法混合排序规则

    Problem MySQL uuid 默认排序规则与配置连接排序规则不进行比较 我有一个使用字符集创建的数据库 表 字段 utf 8和排序规则utf8 polish ci my cnf 如下 init connect SET NAMES u
  • 删除除一行之外的所有具有重复值的行

    我有一个包含三列的表 KEY VALUE and LAST UPDATED 有重复的VALUE字段 我想删除所有具有相同的行VALUE和其他人一样except获取最新更新的信息 因此 如果表包含这些行 1 A 2013 11 08 2 B
  • 我怎样才能完成笛卡尔积函数的 Objective-C 实现?

    作为我的问题的后续here https stackoverflow com questions 8176719 algorithm generating all combinations from items that must be ch
  • 将我的本地数据库(Mysql)复制到远程数据库(phpmyadmin)

    My MySQL database local server is connected to a weather station The data are updated continuously on my local server My
  • mysql 准备好的语句错误:MySQLSyntaxErrorException

    我使用准备好的语句编写了选择语句 每次尝试运行都会出现此错误 我如何克服这个错误 我的jdbc连接器是mysql connector java 5 1 13 bin jar 我的代码 public Main add ad to getAdD
  • 在 Bluemix 中激活 PHP 扩展

    这纯粹是 Bluemix 问题 我的代码在本地主机上顺利运行 但是当我将其迁移到 Bluemix 时 我的数据库连接失败了 检查日志 我发现问题 调用未定义的函数 mysqli init HTTP 响应 500 我发现扩展已被禁用以使其更小
  • MySQL 错误 1264:列的值超出范围

    As I SETMySQL 中的 cust fax 表如下所示 cust fax integer 10 NOT NULL 然后我插入这样的值 INSERT INTO database values 3172978990 但随后它说 错误 1
  • 查找 NSString 中子字符串的所有位置(不仅仅是第一个)

    有一个子串在字符串中出现多次 我用rangeOfString 不过好像只能找到第一个位置 如何找到子字符串的所有位置 NSString subString1 NSString subString2 n NSRange range1 newr
  • Elastic Beanstalk 上的 Django + MySQL - 查询 MySQL 时出错

    当我在 Elastic beanstalk 上托管的 Django 应用程序上查询 MySQL 时 出现错误 错误说 admin login 处出现操作错误 1045 用户 adminDB 172 30 23 5 的访问被拒绝 使用密码 Y
  • iOS HTTP 请求在后台运行

    当应用程序处于后台时 可以向 PHP 服务器发出 HTTP 异步请求吗 该应用程序是基于位置的应用程序 应收集当前位置并每 5 或其他值 分钟将坐标发送到服务器 即使应用程序处于后台 我也可以将 http 帖子发送到服务器吗 我读到了很多关
  • 不确定如何在使用故事板时正确子类化 UIApplication

    我想在 X 次用户不活动 没有触发触摸事件 后返回故事板的初始视图控制器 经过一些研究 我发现检测不活动的最常见方法是触发 NSTimer 并在事件触发时重置间隔 为了检测触发的事件 我们在 UIApplication 的子类中重写 UIA

随机推荐