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])
}
});
}