使用HBuilderX 5+进行app SQLite数据库操作指南

发表时间: 2022-12-19 10:00

HBuilderX 5+app SQLite数据库操作

使用 HBuilderX 进行手机端 app 开发时,可以使用 SQLite 数据库进行本地存储,具体的 api 参考:

https://www.html5plus.org/doc/zh_cn/sqlite.html

包括:

  • openDatabase: 打开数据库
  • isOpenDatabase: 判断数据库是否打开
  • closeDatabase: 关闭数据库
  • transaction: 执行事务
  • executeSql: 执行增删改等操作的SQL语句
  • selectSql: 执行查询的SQL语句

由于这些 api 方法都是异步调用,所以与我们通常的数据库开发有一些差别。为此,我们可以对数据库操作进行封装,方便在开发中进行调用,封装如下:

const dbname = '数据库名称';const dbfilename = '_doc/' + '数据库名称.db'; // 数据库文件// 打开数据库/** successCallback - 数据库操作成功的回调函数* failCallback - 数据库操作失败的回调函数*/function open_db (successCallback, failCallback) {    if (!plus.sqlite.isOpenDatabase({name: dbname, path: dbfilename})) {        plus.sqlite.openDatabase({            name: dbname,            path: dbfilename,            success: function(e){                console.log('openDatabase success!');                successCallback();            },            fail: function(e){                console.log('openDatabase failed: '+JSON.stringify(e));                failCallback(e);            }        });    } else {        successCallback();    }}// 关闭数据库function close_db (successCallback, failCallback) {    if (plus.sqlite.isOpenDatabase({name: dbname, path: dbfilename})) {        plus.sqlite.closeDatabase({            name: dbname,            success: function(e){                console.log('closeDatabase success!');                successCallback();            },            fail: function(e){                console.log('closeDatabase failed: '+JSON.stringify(e));                failCallback(e);            }        });    } else {        successCallback();    }}// 执行普通 SQL 语句,包括 insert update delete 等function run_common_sql (sSql, successCallback, failCallback) {    plus.sqlite.executeSql({        name: dbname,        sql: sSql,        success: function(e){            console.log('SQL: ' + sSql);            console.log('executeSql success!');                 successCallback();        },        fail: function(e){            console.log('executeSql failed: '+JSON.stringify(e));            failCallback(JSON.stringify(e));        }    });}// 执行 select SQL 语句/** 成功回调函数 successCallback 的参数为 data, 对象数组,是 select 语句返回的结果*/function run_select_sql(sSql, successCallback, failCallback) {    plus.sqlite.selectSql({        name: dbname,        sql: sSql,        success: function(data){            console.log('SQL: ' + sSql);            console.log('selectSql success! ');            console.log(JSON.stringify(data));            successCallback(data);        },        fail: function(e){            console.log('selectSql failed: '+JSON.stringify(e));            failCallback(JSON.stringify(e));        }    });}

在 js 中,调用方法举例如下:

(本文以 vue 为例说明)

        mounted () {            let _this = this;            document.addEventListener('plusready', function(){                console.log("所有plus api都应该在此事件发生后调用,否则会出现plus is undefined。");                _this.init_db_1();            });        },        methods: {            db_fail (ex) {                vant.showDialog({ message: ex });            },            init_db_1 () {                open_db(this.init_db_2, this.db_fail);            },            init_db_2 () {                run_common_sql('create table if not exists server(host text, port int)', this.init_db_3, this.db_fail);            },            init_db_3 () {                run_common_sql('create table if not exists storehouse(org_id varchar(64), org_name text, store_house_id varchar(64), store_house_name text)', this.visit_db_1, this.db_fail);            },            visit_db_1 () {                run_select_sql('select host, port from server', this.visit_db_1_success, this.db_fail);            },            visit_db_1_success (data) {                if (data.length <= 0) {                    document.location.href='setupsys.html';                } else {                    this.host = data[0].host;                    this.port = data[0].port;                    run_select_sql('select org_id, org_name, store_house_id, store_house_name from storehouse', this.visit_db_2_success, this.db_fail);                }            },            visit_db_2_success(data) {                        }        }    });

也就是说,调用方法是先调用 open_db,在 open_db 函数中指定回调函数,然后调用执行 sql 语句的函数,每次调用都需要指定下一个成功回调函数,在成功回调函数中继续调用数据库操作。