将 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 服务器数据库同步 的相关文章

  • Laravel - 调用未定义的方法 Illuminate\Database\Query\Builder::user()

    我正忙于Laravel 从头开始 更新记录和预加载 https laracasts com series laravel 5 from scratch episodes 10 我已经遵循了该教程 但在尝试在 CardsController
  • mysql语句中的*星号是什么意思?

    Ex mysql query SELECT FROM members WHERE id id 这意味着选择表中的所有列
  • iPhone应用程序崩溃错误访问异常DataDetectorsCore processToken

    我的 iPhone 应用程序在客户端设备上的 ios 7 0 iphone 5s 上崩溃 我无法弄清楚它出了什么问题 我正在使用 crashlytics 进行崩溃报告 Crashlytics 报告由于线程 9 DataDetectorsCo
  • 如何在sqlite中创建物化视图?

    我对物化视图和 SQLite 进行了无数次搜索 据我所知 2004 年和 2006 年似乎有人提到 SQLite 没有物化视图 紧随其后的是 SQLite 的变更日志2008年3月 http www sqlite org releaselo
  • MySQL+子串怎么做? + 替换?

    我不太擅长 SQL 希望能够变得更好 我在尝试执行某些表操作时遇到一些麻烦 我希望能够从下面的 ProgUID 列中选择子字符串 就像是 SUBSTRING table ProgUID 3 12 这将为我提供 ProgUID P CAMVE
  • iPhone——是否可以在 Xcode 调试器中检查 UIView 的框架?

    当调试器在断点处停止时 我在那里找不到任何 UIView 的框架 是否有可能做到这一点 编辑 由于缺乏回应而开始赏金 需要明确的是 我正在寻找一种在不添加额外调试代码的情况下查看框架的方法 另外 如果答案是 不 你不能这样做 赏金将用于解释
  • PHP PDO相关:更新SQL语句未更新数据库内容

    我正在尝试使用准备好的语句来实现更新语句PHP http en wikipedia org wiki PHP脚本 但它似乎没有更新数据库中的记录 我不确定为什么 所以如果您能分享一些见解 我将不胜感激 Code query UPDATE D
  • iPhone UITableView 分页结果

    对从服务器拉取的大量结果进行分页的最佳方法是什么 就服务器而言 我可以抵消和限制结果 因此我一次只能提取 25 个结果 但是允许用户查看更多结果而不需要像应用商店一样不断向下滚动不断增长的列表的最佳方式是什么应用程序 谢谢 豪伊 要在列表底
  • 将记录分成两列

    我的数据库中有一个 学生 表 其中包含大约 5 000 条记录 我想将这些记录显示在two分区 如何在不执行查询两次的情况下做到这一点 仅使用单个查询 显示示例http www freeimagehosting net uploads f1
  • 社交应用程序的数据库设计和优化注意事项

    通常的情况 我有一个简单的应用程序 允许人们上传照片并关注其他人 因此 每个用户都会有类似 墙 或 活动源 的东西 他或她可以在其中看到他 她的朋友 他或她关注的人 上传的最新照片 大多数功能都很容易实现 然而 当涉及到这个历史活动源时 由
  • 释放 Core Foundation 对象引用

    我是否需要释放 Core Foundation 对象来清理内存 如果是这样 怎么办 例如 在代码中 ABAddressBookRef addressBook ABAddressBookCreate CFArrayRef peopleArra
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • 如何在 phpmyadmin 中创建 MySQL 触发器

    我想在 MySQL 中创建一个触发器 我运行以下命令 mysql gt delimiter mysql gt CREATE TRIGGER before insert money BEFORE INSERT ON money gt FOR
  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • SQlite 获取最近的位置(带有纬度和经度)

    我的 SQLite 数据库中存储有纬度和经度的数据 我想获取距我输入的参数最近的位置 例如我当前的位置 纬度 经度等 我知道这在 MySQL 中是可能的 并且我已经做了相当多的研究 SQLite 需要一个自定义外部函数来实现半正弦公式 计算
  • 滑动删除不起作用

    滑动删除功能在我的表格视图中不起作用 我已经在导航栏中实现了 commitEditingStyle 委托和编辑按钮 因此 当用户单击编辑按钮时 删除和添加按钮会相应显示 但是 在滑动时 删除按钮不会出现 并且似乎它无法将滑动识别为对 set
  • NSDictionary 上的 NSPredicate

    我试图根据字母表在表格视图中创建部分 并在这些部分下按字母顺序对我的条目进行排序 我已经收集了 bandArrayIndex 中 bandArray 每个条目的第一个字母 现在我尝试使用 NSPredicate 来计算每个字母有多少个 我正
  • mysql-如何向列申请补助?

    用户名 撤销对数据库的选择 Person I set GRANT SELECT id ON database Person TO username localhost 不是工作 gt SELECT secret FROM Person Go
  • 如何在 Laravel 查询中使用多个 OR,AND 条件

    我需要 Laravel 查询帮助 我的自定义查询 返回正确结果 Select FROM events WHERE status 0 AND type public or type private 如何写这个查询Laravel Event w

随机推荐