
HBuilderX 5+app SQLite数据库操作
来源:
浏览:105
时间:2023-08-09
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 语句的函数,每次调用都需要指定下一个成功回调函数,在成功回调函数中继续调用数据库操作。