更新记录

1.0.0(2022-11-26)

1.0.0(2022-11-26)

多多罗数据库插件是一款简化Android和Ios平台使用Sqlite数据库的插件,支持规范化使用Sqlite,同时为开发者提供了很大的自由度。 主要内容:

  1. 封装H5+ Plus中对Sqlite的支持
  2. 支持多多罗数据库插件自定义的一套语法规则,该规则对Sql语法不精通的朋友较为友好,可以方便快速的完成创建表以及数据的CRUD
  3. 支持批量新增、批量更新、批量删除
  4. 支持可控事务,即在需要事务支持时可选性的开启事务

平台兼容性

Vue2 Vue3
App 快应用 微信小程序 支付宝小程序 百度小程序 字节小程序 QQ小程序
app-vue app-nvue × × × × × ×
钉钉小程序 快手小程序 飞书小程序 京东小程序
× × × ×
H5-Safari Android Browser 微信浏览器(Android) QQ浏览器(Android) Chrome IE Edge Firefox PC-Safari
× × × × × × × × ×
totoro

多多罗数据库插件(TotoroDB)

说明

多多罗数据库插件开发目标是为需要使用本地数据库存储数据的应用开发场景简化Sqlite的使用。当前仅支持uniapp AndroidIos平台,其他平台均不支持。本插件是对H5+ Plus Sqlite的封装。自定义了一套语法规则用于支持非Sql语句的CRUD,同时也支持开发者直接执行自己的Sql语句。所有plus.sqlite函数均做了Promise封装,开发者可方便的使用async...await...语法。

快速上手

  1. 使用HBuilderX导入插件
  2. 根据项目目录情况将多多罗数据库插件文件复制到需要的目录
  3. 在需要使用数据库的js/vue文件中通过import关键字引入使用即可,具体使用见如下示例
import DBHandle from '@/pages/totoro/db/pickmonster-totoro-db.js';
import {TConf, Table, TField, KeyVal, Condition} from '@/pages/totoro/db/pickmonster-db-obj.js'
// 初始化数据库
let tConf = new TConf();
this.dbHandle = DBHandle.initDB(tConf);
// 创建表
let aField = [
  new TField('id', 'TEXT', 32, true, true),
  new TField('name', 'TEXT', 90, true, false),
  new TField('sex', 'INTERGET', 1, true, false),
];
let table = new Table(this.dbTable, aField);
let tmp = await this.dbHandle.createTable(table);
// 新增数据
let aKeyVal = [
  new KeyVal('id', this.$util.uuid(32).replace(/\-/g,'')),
  new KeyVal('name', this.user.name),
  new KeyVal('sex', this.user.sex),
];
await this.dbHandle.insert('totoro_user', aKeyVal);
// 批量新增
let d2KeyVal = [];
for (let user of this.aNewUser) {
  let aKeyVal = [
    new KeyVal('id', this.$util.uuid(32).replace(/\-/g,'')),
    new KeyVal('name', user.name),
    new KeyVal('sex', user.sex)
  ];
  d2KeyVal.push(aKeyVal)
}
await this.dbHandle.batchInsert('totoro_user', d2KeyVal);
// 删除数据
let aCondition = [new Condition('id', userInfo.id)];
await this.dbHandle.delete('totoro_user', aCondition)
// 批量删除
let d2Condition = [];
for (let user of this.aUser) {
  d2Condition.push(new KeyVal('id', user.id));
}
await this.dbHandle.batchDelete('totoro_user', d2Condition)
// 修改数据
let aKeyVal = [
  new KeyVal('name', this.user.name),
  new KeyVal('sex', this.user.sex),
];
let aCondition = [
  new KeyVal('id', this.user.id),
];
await this.dbHandle.update('totoro_user', aKeyVal, aCondition);
// 批量修改
let d2KeyVal = [];
for (let user of this.aNewUser) {
  let aKeyVal = [
    new KeyVal('name', user.name),
    new KeyVal('sex', user.sex)
  ];
  let aCondition = [
    new KeyVal('id', user.id),
  ]
  d2KeyVal.push([aKeyVal, aCondition])
}
await this.dbHandle.batchUpdate('totoro_user', d2KeyVal);
// 查询数据
let res = await this.dbHandle.query('totoro_user');

自定义语法说明

自定义类说明

  1. TConf(dbName, dbPath):基础配置类
    • dbName:数据库名称
    • dbPath:数据库存放地址,推荐'_doc/xxx.db'
  2. TField(fName, fType, fLength, notNull, isPrimary):建数据表字段定义类
    • fName:字段名称
    • fType:字段类型,支持类型请参考(https://www.runoob.com/sqlite/sqlite-data-types.html)
    • fLength:字段支持长度(由于Sqlite的亲和类型,该长度限制作用有限),默认值:255
    • notNull:是否允许为空,默认值:true
    • isPrimary:是否主键字段,默认值:false
  3. Table(tName, aTField):建数据表类
    • tName:数据表名称
    • aTField:TField数组
  4. Result(data, msg)
    • data:返回数据,注意query和showTables方法为了方便未使用Result封装,均直接返回结果
    • msg:异常说明
    • status:ok/err
  5. KeyVal(key, val):键值对类
    • key:键
    • val:值
  6. Condition(key, val, inLink, outLink):条件键值对类,用于WHERE条件
    • key:键
    • val:值
    • inLink:key与val之间的运算符[=/>/>=/</<=/<>/like]
    • outLink:Condition与前一个Condition之间的关联关系,[AND/OR]

封装函数说明

  1. initDB:初始化函数,仅保存初始化配置
  2. _openDB:打开数据库函数,该方法不需要主动调用,会在执行数据操作时由各方法自动调用
  3. _openTransaction:事务处理,该方法不需要主动调用,会在执行数据操作时由各方法自动调用
  4. closeDB:关闭数据库函数
  5. showTables:查询数据库中所有表
  6. createTable:创建表函数
  7. createTableSql:通过sql创建表函数
  8. batchInsert:批量新增函数
  9. insert:新增函数
  10. batchDelete:批量删除函数
  11. delete:删除函数
  12. batchUpdate:批量更新函数
  13. update:更新函数
  14. query:查询函数
  15. querySql:通过sql查询函数
  16. executeSql:通过sql执行用户操作函数

注意:具体传参请查看totoro-db.js文件源码,所有函数均有说明。

其他说明

  1. 关于防注入问题,当前H5+ Plus并不支持Prepared Statement语法,本人也查阅了很多资料多数的方法是正则匹配拦截转换,但是看了网上提供的方案源码后发现有的过于粗暴,而且效果也无法保证,本人在本插件测试了少量sql注入攻击方法稍有效果,但并不能完全保证可以防止sql注入攻击,因此本插件定义为暂不支持防注入

    // 本插件中简单的防注入方式
    class KeyVal {
    constructor(key, val) {
        this.key = key;
        this.val = `\'${val}\'`; // 将入参值使用单引号包裹转换为字符串处理
    }
    }

隐私、权限声明

1. 本插件需要申请的系统权限列表:

Sqlite

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问