UNI-APP 使用 sqlite 數(shù)據(jù)庫(kù)本地緩存數(shù)據(jù)處理

在 uni-app 使用 sqlite 要先學(xué)習(xí)簡(jiǎn)單的 SQL 語(yǔ)法。
SQLite傳送門(mén)

首要工作

  • plus.sqlite要在手機(jī)或者模擬器上才能運(yùn)行!
  • manifest.json里的App模塊權(quán)限配置里勾選SQLite(數(shù)據(jù)庫(kù))
HBuilderX勾選 SQLite

源碼

封裝的 sqlite.js

  • isOpen 判斷是否打開(kāi)數(shù)據(jù)庫(kù)
  • openSqlite 創(chuàng)建數(shù)據(jù)庫(kù) / 打開(kāi)數(shù)據(jù)庫(kù)
  • closeSqlite 關(guān)閉數(shù)據(jù)庫(kù)
  • createTable 數(shù)據(jù)庫(kù)建表
  • dropTable 數(shù)據(jù)庫(kù)刪表
  • insertTableData 數(shù)據(jù)庫(kù)插入數(shù)據(jù)-無(wú)主鍵
  • insertOrReplaceData 數(shù)據(jù)庫(kù)插入數(shù)據(jù)-有主鍵
  • selectTableData 查詢獲取數(shù)據(jù)庫(kù)里數(shù)據(jù)
  • deleteTableData 刪除表里數(shù)據(jù)
  • updateTableData 更新數(shù)據(jù)表里數(shù)據(jù)
  • pullSQL 獲取指定數(shù)據(jù)條數(shù)
module.exports = {
  dbName: 'chat', // 數(shù)據(jù)庫(kù)名稱
  dbPath: '_doc/chat.db', // 數(shù)據(jù)庫(kù)地址,推薦以下劃線為開(kāi)頭   _doc/xxx.db

  // 判斷數(shù)據(jù)庫(kù)是否打開(kāi)
  isOpen() {
    // 數(shù)據(jù)庫(kù)打開(kāi)了就返回 true,否則返回 false
    var open = plus.sqlite.isOpenDatabase({
      name: this.dbName,  // 數(shù)據(jù)庫(kù)名稱
      path: this.dbPath  // 數(shù)據(jù)庫(kù)地址
    })
    return open;
  },

  // 創(chuàng)建數(shù)據(jù)庫(kù) 或 有該數(shù)據(jù)庫(kù)就打開(kāi)
  openSqlite() {
    return new Promise((resolve, reject) => {
      // 打開(kāi)數(shù)據(jù)庫(kù)
      plus.sqlite.openDatabase({
        name: this.dbName,
        path: this.dbPath,
        success(e) {
          resolve(e); // 成功回調(diào)
        },
        fail(e) {
          reject(e);  // 失敗回調(diào)
        }
      })
    })
  },

  // 關(guān)閉數(shù)據(jù)庫(kù)
  closeSqlite() {
    return new Promise((resolve, reject) => {
      plus.sqlite.closeDatabase({
        name: this.dbName,
        success(e) {
          resolve(e);
        },
        fail(e) {
          reject(e);
        }
      })
    })
  },

  // 數(shù)據(jù)庫(kù)建表 sql:'CREATE TABLE IF NOT EXISTS dbTable("id" varchar(50),"name" TEXT) 
  // 創(chuàng)建 CREATE TABLE IF NOT EXISTS 、 dbTable 是表名,不能用數(shù)字開(kāi)頭、括號(hào)里是表格的表頭
  createTable(dbTable, data) {
    return new Promise((resolve, reject) => {
      // executeSql: 執(zhí)行增刪改等操作的SQL語(yǔ)句
      plus.sqlite.executeSql({
        name: this.dbName,
        sql: `CREATE TABLE IF NOT EXISTS ${dbTable}(${data})`,
        success(e) {
          resolve(e);
        },
        fail(e) {
          reject(e);
        }
      })
    })
  },

  // 數(shù)據(jù)庫(kù)刪表 sql:'DROP TABLE dbTable'
  dropTable(dbTable) {
    return new Promise((resolve, reject) => {
      plus.sqlite.executeSql({
        name: this.dbName,
        sql: `DROP TABLE ${dbTable}`,
        success(e) {
          resolve(e);
        },
        fail(e) {
          reject(e);
        }
      })
    })
  },

  // 向表格里添加數(shù)據(jù) sql:'INSERT INTO dbTable VALUES('x','x','x')'   對(duì)應(yīng)新增
  // 或者 sql:'INSERT INTO dbTable ('x','x','x') VALUES('x','x','x')'   具體新增
  // 插入 INSERT INTO  、 dbTable 是表名、根據(jù)表頭列名插入列值
  insertTableData(dbTable, data, condition) {
    // 判斷有沒(méi)有傳參
    if (dbTable !== undefined && data !== undefined) {
      // 判斷傳的參是否有值
      var bol = (JSON.stringify(data) == "{}");
      if (!bol) {
        if (condition == undefined) {
          var sql = `INSERT INTO ${dbTable} VALUES('${data}')`;
        } else {
          var sql = `INSERT INTO ${dbTable} (${condition}) VALUES(${data})`;
        }
        // console.log(sql);
        return new Promise((resolve, reject) => {
          // 表格添加數(shù)據(jù)
          plus.sqlite.executeSql({
            name: this.dbName,
            sql: sql,
            success(e) {
              resolve(e);
            },
            fail(e) {
              reject(e);
            }
          })
        })
      } else {
        return new Promise((resolve, reject) => { reject("錯(cuò)誤添加") })
      }
    } else {
      return new Promise((resolve, reject) => { reject("錯(cuò)誤添加") })
    }
  },
  
  // 根據(jù)條件向表格里添加數(shù)據(jù)  有數(shù)據(jù)更新、無(wú)數(shù)據(jù)插入
  // (建表時(shí)需要設(shè)置主鍵) 例如 --- "roomid" varchar(50) PRIMARY KEY
  insertOrReplaceData(dbTable, data, condition) {
    // 判斷有沒(méi)有傳參
    if (dbTable !== undefined && data !== undefined) {
        if (condition == undefined) {
          var sql = `INSERT OR REPLACE INTO ${dbTable} VALUES('${data}')`;
        } else {
          var sql = `INSERT OR REPLACE INTO ${dbTable} (${condition}) VALUES(${data})`;
        }
        // console.log(sql);
        return new Promise((resolve, reject) => {
          // 表格添加數(shù)據(jù)
          plus.sqlite.executeSql({
            name: this.dbName,
            sql: sql,
            success(e) {
              resolve(e);
            },
            fail(e) {
              reject(e);
            }
          })
      })
    } else {
      return new Promise((resolve, reject) => { reject("錯(cuò)誤添加") })
    }
  },

  // 查詢獲取數(shù)據(jù)庫(kù)里的數(shù)據(jù) sql:'SELECT * FROM dbTable WHERE lname = 'lvalue''
  // 查詢 SELECT * FROM 、 dbTable 是表名、 WHERE 查找條件 lname,lvalue 是查詢條件的列名和列值
  selectTableData(dbTable, lname, lvalue, cc, dd) {
    if (dbTable !== undefined) {
      // 第一個(gè)是表單名稱,后兩個(gè)參數(shù)是列表名,用來(lái)檢索
      if (lname !== undefined && cc !== undefined) {
        // 兩個(gè)檢索條件
        var sql = `SELECT * FROM ${dbTable} WHERE ${lname} = '${lvalue}' AND ${cc} = '${dd}'`;
      }
      if (lname !== undefined && cc == undefined) {
        // 一個(gè)檢索條件
        var sql = `SELECT * FROM ${dbTable} WHERE ${lname} = '${lvalue}'`;
        // console.log(sql);
      }
      if (lname == undefined) {
        var sql = `SELECT * FROM ${dbTable}`;
      }
      return new Promise((resolve, reject) => {
        // 表格查詢數(shù)據(jù)  執(zhí)行查詢的SQL語(yǔ)句
        plus.sqlite.selectSql({
          name: this.dbName,
          sql: sql,
          success(e) {
            resolve(e);
          },
          fail(e) {
            reject(e);
          }
        })
      })
    } else {
      return new Promise((resolve, reject) => { reject("錯(cuò)誤查詢") });
    }
  },

  // 刪除表里的數(shù)據(jù) sql:'DELETE FROM dbTable WHERE lname = 'lvalue''
  // 刪除 DELETE FROM 、 dbTable 是表名、 WHERE 查找條件 lname,lvalue 是查詢條件的列名和列值
  deleteTableData(dbTable, lname, lvalue, ww, ee) {
    if (dbTable !== undefined) {
      if (lname == undefined) {
        var sql = `DELETE FROM ${dbTable}`;
      } else {
        if (ww !== undefined) {
          // 兩個(gè)檢索條件
          var sql = `DELETE FROM ${dbTable} WHERE ${lname} = '${lvalue}' AND ${ww} = '${ee}'`;
        } else {
          // 一個(gè)檢索條件
          var sql = `DELETE FROM ${dbTable} WHERE ${lname} = '${lvalue}'`;
        }
      }
      return new Promise((resolve, reject) => {
        // 刪除表數(shù)據(jù)
        plus.sqlite.executeSql({
          name: this.dbName,
          sql: sql,
          success(e) {
            resolve(e);
          },
          fail(e) {
            reject(e);
          }
        })
      })
    } else {
      return new Promise((resolve, reject) => { reject("錯(cuò)誤刪除") });
    }
  },

  // 修改數(shù)據(jù)表里的數(shù)據(jù) sql:"UPDATE dbTable SET 列名 = '列值',列名 = '列值' WHERE lname = 'lvalue'"
  // 修改 UPDATE 、 dbTable 是表名, data: 要修改的列名=修改后列值, lname,lvalue 是查詢條件的列名和列值
  updateTableData(dbTable, data, lname, lvalue) {
    if (lname == undefined) {
      var sql = `UPDATE ${dbTable} SET ${data}`;
    } else {
      var sql = `UPDATE ${dbTable} SET ${data} WHERE ${lname} = '${lvalue}'`;
    }
    // WHERE 前面是要修改的列名、列值,后面是條件的列名、列值
    return new Promise((resolve, reject) => {
      // 修改表數(shù)據(jù)
      plus.sqlite.executeSql({
        name: this.dbName,
        sql: sql,
        success(e) {
          resolve(e);
        },
        fail(e) {
          reject(e);
        }
      })
    })
  },

  // 獲取指定數(shù)據(jù)條數(shù)  sql:"SELECT * FROM dbTable ORDER BY 'id' DESC LIMIT 15 OFFSET 'num'"
  // dbTable 表名, ORDER BY 代表排序默認(rèn)正序, id 是排序的條件 DESC 代表倒序,從最后一條數(shù)據(jù)開(kāi)始拿
  // LIMIT 15 OFFSET '${num}',這句的意思是跳過(guò) num 條拿 15 條數(shù)據(jù), num 為跳過(guò)多少條數(shù)據(jù)是動(dòng)態(tài)值
  // 例 初始num設(shè)為0,就從最后的數(shù)據(jù)開(kāi)始拿15條,下次不拿剛獲取的數(shù)據(jù),所以可以讓num為15,這樣就能一步一步的拿完所有的數(shù)據(jù)
  pullSQL(dbTable, id, num) {
    return new Promise((resolve, reject) => {
      plus.sqlite.selectSql({
        name: this.dbName,
        sql: `SELECT * FROM ${dbTable} ORDER BY '${id}' DESC LIMIT 15 OFFSET '${num}'`,
        success(e) {
          resolve(e);
        },
        fail(e) {
          reject(e);
        }
      })
    })
  }

在頁(yè)面 import 引入 sqlite.js

// 引入
import DB from "@/common/sqlite.js";

// 查詢數(shù)據(jù)庫(kù)是否打開(kāi)
DB.isOpen()

// 創(chuàng)建/開(kāi)啟數(shù)據(jù)庫(kù)
DB.openSqlite()

// 關(guān)閉數(shù)據(jù)庫(kù)
DB.closeSqlite()

// 數(shù)據(jù)庫(kù)建表
DB.createTable()

// 數(shù)據(jù)庫(kù)刪表
DB.dropTable()

// 表里新增/插入數(shù)據(jù)
DB.insertTableData()

// 根據(jù)條件向表里插入數(shù)據(jù)、更新或覆蓋
DB.insertOrReplaceData()

// 表里查詢數(shù)據(jù)
DB.selectTableData()

// 表里刪除數(shù)據(jù)
DB.deleteTableData()

// 表里修改數(shù)據(jù)
DB.updateTableData()

// 倒敘查詢數(shù)據(jù)
DB.pullSQL()

這里有一個(gè)小demo可以看看 傳送門(mén)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容