跳转到内容

sqlite 模块用于在脚本中操作 SQLite 数据库,支持数据库创建与打开、表结构管理、增删改查(CRUD)、事务处理以及原生 SQL 查询等功能,适合用于本地数据持久化存储。

sqlite.open(path[, options, callbacks])

  • path {string}
    数据库文件路径。支持相对路径和绝对路径。如果数据库不存在,将自动创建。

  • options {Object}(可选)
    数据库配置选项:

    • version {number} 数据库版本号
  • callbacks {Object}(可选)
    生命周期回调:

    • onOpen(db) 数据库打开时回调
  • 返回 {Database}

创建或打开数据库连接。

js
let db = sqlite.open("./data.db", {
    version: 1
}, {
    onOpen: function(db) {
        console.log("数据库已打开");
        //创建表
        db.execSQL(
            "CREATE TABLE IF NOT EXISTS STUDENT(" +
            "`id` INTEGER PRIMARY KEY AUTOINCREMENT," +
            "`name` TEXT NOT NULL," +
            "`age` INTEGER NOT NULL," +
            "`score` INTEGER" +
            ")"
        );
    }
});

Database

sqlite.open返回的对象。

Database.execSQL(sql[, args])

  • sql {string} SQL 查询语句
  • args {Array | null} SQL 参数

执行不返回结果的 SQL 语句(如建表、删表等)。

js
db.execSQL("DROP TABLE IF EXISTS TEMP");

Database.insert(table, values)

  • table {string} 表名
  • values {Object} 键值对形式的数据
  • 返回 {number} 新插入行的 rowId,失败返回 -1

向指定表插入一条记录。

js
let id = db.insert("STUDENT", {
    name: "张三",
    age: 18,
    score: 90
});
console.log(id)

Database.update(table, values, whereClause, whereArgs)

  • table {string} 表名
  • values {Object} 要更新的字段
  • whereClause {string} WHERE 条件(不包含 WHERE)
  • whereArgs {Array} 条件参数
  • 返回 {number} 受影响的行数

更新表中符合条件的记录。

js
db.update(
    "STUDENT",
    { score: 70 },
    "name = ?",
    ["李四"]
);

Database.delete(table, whereClause, whereArgs)

  • table {string} 表名
  • whereClause {string} WHERE 条件
  • whereArgs {Array | null} 条件参数
  • 返回 {number} 删除的行数

删除表中符合条件的记录。

js
db.delete("STUDENT", "score > 80", null);

Database.rawQuery(sql, args)

  • sql {string} SQL 查询语句
  • args {Array | null} SQL 参数
  • 返回 {Cursor} 对象

执行一条原生 SQL 查询语句。

js
let cursor = db.rawQuery("SELECT * FROM STUDENT WHERE age > ?", [18]);

Database.transaction(callback)

  • callback
  • 返回 {Transaction} 对象,可绑定事件监听。

开启一个数据库事务。事务中的所有操作将作为一个整体提交,若抛出异常则回滚。

js
db.transaction(function() {
    db.delete("STUDENT", "age = 18", null);
    db.update("STUDENT", { score: 100 }, "age = 19", null);
});

Database.close()

使用完成后,务必关闭数据库以释放资源。

js
db.close();

Database.version

  • 返回 {number} 数据库版本号
js
console.log("数据库版本:", db.version);

Database.pageSize

  • 返回 {number} 数据库页大小
js
console.log("页大小:", db.pageSize);

Database.maximumSize

  • 返回 {number} 数据库最大大小
js
console.log("最大大小:", db.maximumSize);

Database.path

  • 返回 {string} 数据库文件路径
js
console.log("路径:", db.path);

Cursor

Cursor 表示一次查询结果集,用于逐行读取数据。

Cursor.moveToNext()

  • 返回 {boolean} 是否还有数据

移动到下一行。

Cursor.pick()

  • 返回 {Object}

获取当前行的所有字段。

js
while (cursor.moveToNext()) {
    console.log(cursor.pick());
}
cursor.close();

Cursor.single()

  • 返回 {Object | null}

获取第一条记录。

js
let student = db.rawQuery("SELECT * FROM STUDENT", null).single();

Cursor.all()

  • 返回 {Array<Object>}

获取所有记录。

js
let list = db.rawQuery("SELECT * FROM STUDENT", null).all();

Transaction 事件

事务支持以下事件监听:

begin

事务开始

commit

事务提交成功

rollback

事务回滚

end

事务结束(无论成功或失败)

error

事务执行异常

js
db.transaction(function() {
    db.delete("STUDENT", "age = 18", null);
}).on("begin", function(t) {
    console.log("事务开始");
}).on("commit", function(t) {
    console.log("事务完成");
}).on("rollback", function(t) {
    console.log("事务回滚");
}).on("end", function(t) {
    console.log("事务结束");
}).on("error", function(e) {
    console.error(e);
});

示例

数据库增删改查

js
// 创建或打开一个数据库文件,在当前目录的data.db文件
let db = sqlite.open("./data.db", {
    version: 1
}, {
    onOpen: function(db) {
        // 数据库打开时,执行创建数据库表的语句
        // 我们设计的表名为STUDENT(学生),字段如下:
        // id: 整数,自增,键
        // name: 学生姓名,文本,非空
        // age: 年龄,整数,非空
        // score: 分数,整数
        db.execSQL("CREATE TABLE IF NOT EXISTS STUDENT(" +
            "`id` INTEGER PRIMARY KEY AUTOINCREMENT, " +
            "`name` TEXT NOT NULL, " +
            "`age` INTEGER NOT NULL, " +
            "`score` INTEGER" +
            ")");
    }
});

// 插入三个数据
console.log("插入张三: ", db.insert("STUDENT", {
    name: "张三",
    age: 18,
    score: 90
}));
console.log("插入李四: ", db.insert("STUDENT", {
    name: "李四",
    age: 19,
    score: 60
}));
console.log("插入王五: ", db.insert("STUDENT", {
    name: "王五",
    age: 20
}));

// 查询数据
console.log("所有数据: ", db.rawQuery("SELECT * FROM STUDENT", null).all());
console.log("第一个数据: ", db.rawQuery("SELECT * FROM STUDENT", null).single());

// 修改数据
console.log("修改李四分数: ", db.update("STUDENT", {
    score: 70
}, "name = ?", ["李四"]));
console.log("修改后李四: ", db.rawQuery("SELECT * FROM STUDENT WHERE name = ?", ["李四"]).single());

// 删除数据
console.log("删除分数>80的学生: ", db.delete("STUDENT", "score > 80", null));
// 删除后遍历数据
console.log("删除后:");
let cursor = db.rawQuery("SELECT * FROM STUDENT", null);
while (cursor.moveToNext()) {
    console.log(cursor.pick());
}
// 记得关闭cursor
cursor.close();

// 还要关闭数据库
db.close();

数据库事务

js
// 需要先运行过"数据库增删改查"脚本再运行此脚本
let db = sqlite.open("./data.db");

db.transaction(function() {
    db.delete("STUDENT", "age = 18", null);
    db.update("STUDENT", {
        score: 100
    }, "age = 19", null);
}).on("begin", function(t) {
    console.log("事务开始: ", t);
}).on("commit", function(t) {
    console.log("事务完成: ", t);
}).on("rollback", function(t) {
    console.log("事务回滚: ", t);
}).on("end", function(t) {
    console.log("事务结束: ", t);
}).on("error", function(e) {
    console.error(e);
});

db.close();

获取数据库信息

js
// 需要先运行过"数据库增删改查"脚本再运行此脚本
let db = sqlite.open("./data.db");
console.log("数据库版本: ", db.version);
console.log("数据库页大小: ", db.pageSize);
console.log("数据库最大大小: ", db.maximumSize);
console.log("数据库路径: ", db.path);
console.log("数据库所有表的信息: ", db.rawQuery("SELECT * FROM sqlite_master WHERE type='table'", null).all());