sqlite的简单使用,从入门到....自暴自弃..
uniapp sqlite模块用于操作本地数据库文件,可实现数据库文件的创建,执行SQL语句等功能.
注意:HBuilderX1.7.2及以上版本支持此功能。
在此之前需要了解什么是plus?
以plus开头的方法都是属于HTML5+环境调用的方法。
plus不能在浏览器环境下使用,它必须在手机APP上才能使用,因为以安卓为例,他是操纵webview的API。在5+中,我们在使用plus之前要监听HTML5+环境是否已经加载完毕,而在uniapp中,则可以直接调用,可以参看uni-app使用plus注意事项。
什么是webview?
WebView是android中一个非常重要的控件,它的作用是用来展示一个web页面。它使用的内核是webkit引擎,4.4版本之后,直接使用chrome作为内置网页浏览器。它的作用是显示和渲染页面,可与页面JavaScript加护,实现混合开发。
uniapp打包App 端内置 HTML5+ 引擎
sqlite使用
sqlite方法: 参考文档: https://www.html5plus.org/doc/zh_cn/sqlite.html#plus.sqlite.executeSql
openDatabase: 打开数据库
isOpenDatabase: 判断数据库是否打开
closeDatabase: 关闭数据库
transaction: 执行事务
executeSql: 执行增删改等操作的SQL语句
selectSql: 执行查询的SQL语句
方法的前缀 plus.sqlite 表示 plus的sqlite的方法
- openDatabase,isOpenDatabase,closeDatabase
//如果数据库存在则打开,不存在则创建。
plus.sqlite.openDatabase({
name: 'first', // ( String ) 必选 数据库名称
path: '_doc/test.db', // ( String ) 必选 数据库路径
success: function(e){
console.log('openDatabase success!');
},
fail: function(e){
console.log('openDatabase failed: '+JSON.stringify(e));
}
});
//数据库已经打开则返回true,数据库没有打开则返回false。 HBuilderX1.9.0及以上版本支持。
plus.sqlite.isOpenDatabase({
name: 'first', // ( String ) 必选 数据库名称
path: '_doc/test.db', // ( String ) 必选 数据库路径
success: function(e){
console.log('openDatabase success!');
//返回值 Boolean : true表示数据库已打开,false表示数据库没有打开。
},
fail: function(e){
console.log('openDatabase failed: '+JSON.stringify(e));
}
});
//完成数据库操作后,必须关闭数据库,否则可能会导致系统资源无法释放。
plus.sqlite.closeDatabase({
name: 'first',
success: function(e){
console.log('closeDatabase success!');
},
fail: function(e){
console.log('closeDatabase failed: '+JSON.stringify(e));
}
});
2.transaction
plus.sqlite.transaction({
name: 'first',
operation: 'begin', //可选值:begin(开始事务)、commit(提交)、rollback(回滚)。
success: function(e){
console.log('transaction success!');
},
fail: function(e){
console.log('transaction failed: '+JSON.stringify(e));
}
});
- executeSql,selectSql
plus.sqlite.executeSql({
name: 'first', //name: ( String ) 必选 数据库名称
sql: "sql", //sql: ( Array[String] | String ) 必选 需要执行的SQL语句
//参数为字符串时,表示执行单条SQL语句; 参数为字符串数组时(HBuilderX2.5.5+支持),表示执行多条SQL语句,按数组顺序执行,某条SQL语句执行错误则终止。 注意:Android平台不支持SQL语句中使用“;”分割多条命令,要运行多条命令请使用字符串数组参数。
success: function(e){
console.log('executeSql success!');
},
fail: function(e){
console.log('executeSql failed: '+JSON.stringify(e));
}
});
sql 的简单使用语法
创建删除
创建 create table
create table if not exists imglocation(key1,key2,key3) //创建一个imglocation表名的表,有的话链接 没有的话创建 表结构为key1,key2,key3
删除表
DROP TABLE 表名; //直接删除表结构
增删改查
插入insert
"insert into mixtureinfo (ciid,miid) VALUES('"mixtureList[i].ciid+"','"+mixtureList[i].miid+"')";
insert into 表名(字段key1,字段key2)VALUES (字段key1值,字段key1值)
也可 : insert into 表名 VALUES (字段key1值,字段key1值)
注意 每个值要用引号 引起来
删除表内容 DELETE
DELETE FROM 表名; //删除表内容 不删除表结构
//后可接 条件语句 删除指定数据
//如:
`DELETE FROM mixtureinfoss where meter_book_id = '${id}'`
修改UPDATE update
var sqlInfo =
`read_status='2',read_source='2',read_end_code='${this.waterList.read_end_code - 0}',read_waters='${this.sum}',read_adj_waters='0',read_settle_waters='${this.sum}',read_situation='${this.waterList.read_situation}',read_memo='${this.waterList.read_memo}'`
var sql = `UPDATE mixtureinfoss SET ${sqlInfo} WHERE id = '${this.waterList.id}' `
UPDATE 表名 SET 要修改的数据key1=data1 键与值一一对应 //在没有使用条件语句时 修改的是整个表
注意:修改时 一定要加条件语句
查询 select
//所有
select * from mixtureinfo // 查询 from表名 所有字段
select 返回字段key form 表名 where 查询条件 //返回所有的话 就用
`select * from mixtureinfoss where meter_book_id='${this.fromInfo.data.meter_book_id}' AND read_status in(${read_status}) AND meter_code LIKE '%${this.fromInfo.data.fulltext}%' limit ${ this.fromInfo.pageSize } offset ${ (this.fromInfo.currentPage - 1)*this.fromInfo.pageSize}`
条件语句 where
一般where 后接的是筛选条件,对前面的结果进行筛选 执行顺序按照代码顺序
AND 并且 满足前面条件也满足后面条件 取的是交集
OR 或 满足前面条件或满足后面条件都行 取的是并集
limit 10 offset 0 //从0索引开始 10条数据 limit 返回的条数(number) offset 符合条件的数据的索引(0)
sql语法参考文档: https://www.runoob.com/w3cnote/sql-syntax-manual.html
SQLite语法参考文档: https://www.runoob.com/sqlite/sqlite-drop-table.html
sql进阶语法参考文档:http://c.biancheng.net/view/7389.html
封装SQLite操作的工具函数
//日志开关
var logFlag = true;
/**
* 全局的日志方法
* @param {Object} message
*/
export function logUtils(message) {
if (logFlag) {
console.log(message);
}
}
/**
* 判断数据库是否打开
*/
function sqliteIsOpen() {
return plus.sqlite.isOpenDatabase({
name: 'readmachine',
path: '_doc/readmachine.db'
});
}
/**
* 打开数据库
*/
function openDB() {
if (!sqliteIsOpen()) {
plus.sqlite.openDatabase({
name: 'readmachine',
path: '_doc/readmachine.db',
success: function(e) {
logUtils('openDatabase success! 数据库初始化成功');
},
fail: function(e) {
logUtils('openDatabase failed: ' + JSON.stringify(e));
}
})
}else{
logUtils('openDatabase! 数据库已初始化');
}
}
/**
* 关闭数据库
*/
function colseDB() {
if (sqliteIsOpen()) {
plus.sqlite.closeDatabase({
name: 'readmachine',
success: function(e) {
logUtils('closeDatabase success!');
},
fail: function(e) {
logUtils('closeDatabase failed: ' + JSON.stringify(e));
}
})
}
}
//执行数据库
function executeSQL(exsql) {
if (!sqliteIsOpen()) {
openDB();
}
return new Promise((resolve, reject) => {
plus.sqlite.executeSql({
name: 'readmachine',
sql: exsql,
success: function(e) {
resolve("操作成功");
logUtils('executeSql success!');
// console.log('executeSql success!');
},
fail: function(e) {
reject(JSON.stringify(e));
}
});
});
}
//查询数据库
function selectSQL(sql) {
if (!sqliteIsOpen()) {
openDB()
};
return new Promise((resolve, reject) => {
try {
plus.sqlite.selectSql({
name: 'readmachine',
sql: sql,
success: function(data) {
resolve(data);
logUtils('查询成功:' + data.length + "条");
},
fail: function(e) {
reject(e);
logUtils('selectSql failed: ' + JSON.stringify(e));
}
});
} catch (e) {
resolve([e])
}
});
}