database.applyChangeset(changeset[, options])


  • changeset <Uint8Array> 一个二进制变更集或补丁集。
  • options <Object> 配置选项,用于设置变更将如何应用。
    • filter <Function> 跳过那些在向此函数提供目标表名时返回真值的更改。默认情况下,会尝试所有更改。

    • onConflict <Function> 一个用于确定如何处理冲突的函数。该函数接收一个参数,该参数可以是以下值之一:

      • SQLITE_CHANGESET_DATADELETEUPDATE 变更不包含预期的“之前”值。
      • SQLITE_CHANGESET_NOTFOUND:与 DELETEUPDATE 更改的主键匹配的行不存在。
      • SQLITE_CHANGESET_CONFLICTINSERT 操作导致主键重复。
      • SQLITE_CHANGESET_FOREIGN_KEY: 应用更改会导致外键冲突。
      • SQLITE_CHANGESET_CONSTRAINT:应用更改会导致 UNIQUECHECKNOT NULL 约束违规。

      该函数应返回以下值之一:

      • SQLITE_CHANGESET_OMIT:省略冲突的更改。
      • SQLITE_CHANGESET_REPLACE:用冲突的更改替换现有值(仅在 SQLITE_CHANGESET_DATASQLITE_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.