我正在使用带有Javascript(Cordova)的sqlite数据库的transaction.executeSql()执行sql查询。我需要将最后执行的查询存储在表中以供将来使用(同步)。我没有找到类似的东西。有什么建议吗?
db.transaction(function(tx) {
tx.executeSql("Insert into tablename (id, name) Values(?,?);", values, function(tx, results)
{
// I need the last executed query here.
});
数据正在sqlite离线更新。当用户点击"同步"按钮我将不得不将此用户的所有更新推送到服务器。所以,我以为我会将这个用户执行的所有查询存储在一个表中。当他/她点击同步按钮时,我将在实时mysql上执行这些查询。
编辑1: 这不仅用于备份目的。用户可以添加一些新项目并更新它们。所有其他用户应在同步后在其数据库中获得此更改。值得注意的是,沟通将是双向的。首先,sqlitedb将从实时服务器更新,然后我将在实时服务器中执行所有已保存的查询。这是计划。
有没有更好的方法?
答案 0 :(得分:0)
如果数据库的大小合理,您可以压缩它并同步“.db.gz”文件。如果您存储每个SQL查询并对其进行同步,则最终可能会出现类似
的内容DELETE FROM x where a=1
UPDATE x set a=2,b=3
INSERT INTO x set c=2
但是如果同步“.db”文件,它只包含 INSERT 语句以及模式定义。但是,在服务器端,您需要有效地将其导入MYSQL。
如果它仅用于备份目的,并且您不需要生成任何报告,或者您不需要合并所有这些用户数据,那么只需将SQLite存储在服务器上即可生存。但我不知道你的项目究竟是什么。
答案 1 :(得分:0)
我在几个带有后端的企业应用程序中使用同步,这是我的方式:
如果可能,请使用SSL。
在我的工作流程中,设备通过扫描后端网站中的条形码进行注册。作为后退,可以在设备上以表格形式进行注册。
我使用编码来传输数据。每个设备都有自己的代码。密钥通过条形码/表格传送到设备。
我在后端有以下客户端表:
在每个必须同步的表中,我都有一个创建和修改过的列。这是一个日期时间,创建/修改由触发器插入。
在同步任务中,设备正在将UUID发送到服务器,服务器查找有效的注册,自上次同步以来创建的行,自上次同步以来修改的行以及行删除 - 作业。
同步日期时间保存在tblClientLogs
8.加密数据,后端发送到客户端是对象,看起来像:
tblWhatEver - >创建 - > {key:value,key:value,...}
或
tblWhatEver - >修改 - > rowUUID {key:value,key:value,...}
或
tblWhatEver - >删除 - > rowUUID
deviceUUID,tableName,rowUUID
在同步任务之后,将删除tblClientDelete中的device-delete-job。
在收到数据到设备后,我解密它并为每个数据创建一个sql语句。 sql作业由循环完成。
在设备上完成所有工作后,我会向后端发送一份小报告,以检查一切是否顺利。
在每个设备表中,我使用UUID而不是整数来避免冲突。在我的设备上,您也可以将数据发送到服务器,它的工作方式类似于«下载»。
我的应用和服务器的时区相同,与设备位置无关。
在后端和应用程序中,如果出现问题,我会从头开始包含强制同步。
在某些应用程序中,我有更多选项,我可以通过后端更改数据库,表格结构。