使用HBuilderX 5+进行app SQLite数据库操作指南
发表时间: 2022-12-19 10:00
使用 HBuilderX 进行手机端 app 开发时,可以使用 SQLite 数据库进行本地存储,具体的 api 参考:
https://www.html5plus.org/doc/zh_cn/sqlite.html
包括:
由于这些 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 语句的函数,每次调用都需要指定下一个成功回调函数,在成功回调函数中继续调用数据库操作。