database.applyChangeset(changeset[, options])
changeset<Uint8Array> 一个二进制变更集或补丁集。options<Object> 配置选项,用于设置变更将如何应用。-
filter<Function> 跳过那些在向此函数提供目标表名时返回真值的更改。默认情况下,会尝试所有更改。 -
onConflict<Function> 一个用于确定如何处理冲突的函数。该函数接收一个参数,该参数可以是以下值之一:SQLITE_CHANGESET_DATA:DELETE或UPDATE变更不包含预期的“之前”值。SQLITE_CHANGESET_NOTFOUND:与DELETE或UPDATE更改的主键匹配的行不存在。SQLITE_CHANGESET_CONFLICT:INSERT操作导致主键重复。SQLITE_CHANGESET_FOREIGN_KEY: 应用更改会导致外键冲突。SQLITE_CHANGESET_CONSTRAINT:应用更改会导致UNIQUE、CHECK或NOT NULL约束违规。
该函数应返回以下值之一:
SQLITE_CHANGESET_OMIT:省略冲突的更改。SQLITE_CHANGESET_REPLACE:用冲突的更改替换现有值(仅在SQLITE_CHANGESET_DATA或SQLITE_CHANGESET_CONFLICT冲突中有效)。SQLITE_CHANGESET_ABORT:在冲突时中止操作并回滚数据库。
当在冲突处理程序中抛出错误或从处理程序返回任何其他值时,应用更改集将被中止,数据库将回滚。
默认:一个返回
SQLITE_CHANGESET_ABORT的函数。
-
- 返回:<boolean> 变更集是否成功应用且未被中止。
如果数据库未打开,将抛出异常。此方法是 sqlite3changeset_apply() 的一个封装。
【An exception is thrown if the database is not
open. This method is a wrapper around sqlite3changeset_apply().】
const sourceDb = new DatabaseSync(':memory:');
const targetDb = new DatabaseSync(':memory:');
sourceDb.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)');
targetDb.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)');
const session = sourceDb.createSession();
const insert = sourceDb.prepare('INSERT INTO data (key, value) VALUES (?, ?)');
insert.run(1, 'hello');
insert.run(2, 'world');
const changeset = session.changeset();
targetDb.applyChangeset(changeset);
// Now that the changeset has been applied, targetDb contains the same data as sourceDb.