它是如何工作的?

您的应用程序将使用包含LiteSync代码的SQLite库的修改版本来访问数据库。

SQLite库上的修改仅仅是内部的,接口还是相同的。

LiteSync库将相互通信,交换数据。






复制

首次打开该应用程序时,它将连接到其他节点并下载数据库的新副本。

在集中式网络中,主节点将数据库副本发送到辅助节点。

一旦下载,该节点即开始同步。



同步

一旦节点具有相同的基本数据库,它们便交换离线时执行的事务。

此后,它们进入在线模式,并且一旦在节点中执行了新事务,该事务便被转移以在连接的节点中执行。

如果该节点处于离线状态,则该事务将存储在本地日志中,以便以后进行交换。



我是否需要更改我的应用代码?

这里有几个步骤但是基本上我们必须更改在数据库中打开的URI代码:

“file:/path/to/app.db”

改成这样:

“file:/path/to/app.db?node=secondary&connect=tcp://server.ip:1234”

好消息是LiteSync使用本机SQLite3接口。这意味着我们不需要使用其他API。



连接

每个节点有两个选项

bind连接到一个地址
connect连接到一个对等地址

因此,您可以从一个设备连接到另一个设备。可以便于连接到路由器或防火墙后面的设备。



支持的拓扑网络


集中式网络, 星形网络


在拓扑网络中,我们必须要有一个主节点,其他节点将连接主节点,因此主节点必须在线才能进行同步。

以下是一些示例配置:


主节点可以绑定到地址,辅节点可以连接到该地址。

主节点:

"file:/home/user/app.db?node=primary&bind=tcp://0.0.0.0:1234"

副节点(其他设备):

"file:/home/user/app.db?node=secondary&connect=tcp://server:1234"


主节点也可以连接到副节点。

主节点:

"file:/home/user/app.db?node=primary&connect=tcp://address1:port1,tcp://address2:port2"

副节点(其他分开的设备):

"file:/home/user/app.db?node=secondary&bind=tcp://0.0.0.0:1234"


我们甚至可以同时使用这两个选项。

主节点:

"file:/home/user/app.db?node=primary&bind=tcp://0.0.0.0:1234&connect=tcp://address1:port1"

副节点1:

"file:/home/user/app.db?node=secondary&connect=tcp://server:1234"

副节点2:

"file:/home/user/app.db?node=secondary&bind=tcp://0.0.0.0:1234"



对等拓扑


完全连接的对等网络是在主节点之间建立的。

我们需要在每个节点上手动通知网络上的节点总数(目前)

还必须告知连接方向(哪些节点将连接到哪个节点)

这是一个具有3个节点的网络的示例:

节点1:

"file:db1.db?node=primary&total_primary_nodes=3&bind=tcp://0.0.0.0:1201"

节点2:

"file:db2.db?node=primary&total_primary_nodes=3&bind=tcp://0.0.0.0:1202& connect=tcp://127.0.0.1:1201"

节点3:

"file:db3.db?node=primary&total_primary_nodes=3&bind=tcp://0.0.0.0:1203& connect=tcp://127.0.0.1:1201,tcp://127.0.0.1:1202"



混合拓扑


在此拓扑中,我们有多个作为对等节点连接的主节点,并且有许多与它们连接的辅助节点。

主节点的配置与对等拓扑中的配置相同(如上所述)。

每个辅助节点将在给定时间连接到单个主节点。 我们可以告知许多主要节点的地址,以便它们随机选择一个。 如果到主节点的连接断开,它将连接到另一主节点。

这是辅助节点的示例URI:

"file:db4.db?node=secondary&connect=tcp://127.0.0.1:1201,tcp://127.0.0.1:1202,tcp://127.0.0.1:1203"



同步状态

我们可以使用以下命令检查同步状态:

PRAGMA sync_status

它会返回一个JSON字符串。



同步通知

当由于与远程节点同步而更新本地数据库时,可以通知您的应用程序。 通知是通过用户定义的功能完成的。

选择编程语言 -->

重要提示: 通知函数由工作线程调用。 该应用程序不应在通知功能内使用数据库连接,并且必须尽快返回! 应用程序可以在返回之前将通知转移到主线程。



检查数据库是否准备就绪

如果应用程序是首次在设备上打开,它可以从另一个节点下载数据库的新副本。在完成之前,我们无法访问数据库。

我们可以检索同步状态并检查db_is_ready变量。

在下面查看基本的应用示例。



如何在我的应用程序中使用它?

共有3个步骤:

1  将SQLite库替换为包含LiteSync的库

2  更改URI连接字符串

3  检查数据库准备就绪状态

编译C和C ++应用程序时,必须将应用程序链接到LiteSync库。

对于其他语言,您必须安装正确的包装器



主节点示例

主节点可以是普通应用程序,与副节点完全相同,但使用不同的URI。

或者我们可以使用专用于主要节点的应用程序。

仅用于保持集中式网络节点的基本独立应用程序如下所示:

选择编程语言 -->



基本应用示例

写入本地数据库的基本应用程序如下所示:

选择编程语言 -->



目前已知问题

1  避免使用每次调用时都返回不同值的函数,例如random()date('now')

2  AUTOINCREMENT关键字是不支持的

3  只有单个应用程序可以同时访问数据库。每个实例必须使用其自己的数据库,然后它们将通过LiteSync进行复制和同步