更新记录

2.2.2(2022-02-18) 下载此版本

  1. 解决了自增约束的部分bug
  2. 解决了处理类型的问题

2.2.0(2022-02-16) 下载此版本

  1. 重新处理了判断类型的方法
  2. 解决了no connect的问题
  3. 新增了自增约束,需要为数字类型

2.1.0(2022-01-14) 下载此版本

  1. 新增了添加多个数据的事件选项(options, index)(感谢@风扬
查看更多

平台兼容性

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

onemue-USQLite

没有特别说明,均为异步函数

u-SQLite 交流群:643867519 如果觉的当前插件对你有帮助可以前往 github 点 star!

技术亮点

  1. 基于ORM技术,使用对象的方式来操作sqlite数据库,而无需编写任何sql语句
  2. 支持数据库的常规操作增删改查,API极为简洁,且高效智能。
  3. 支持条件查询 与 分页查询
  4. 支持原生sql语句,如果我们的框架无法满足您的需求,我们也提供了特殊的API可以直接使用sql语句来操作
  5. 支持链式语法

    使用方法

挂载方法

// main.js
import { usqlite } from '@/uni_modules/onemue-USQLite/js_sdk/usqlite.js'
uni.$sql = usqlite;

链接数据库

//如果数据库存在则连接,不存在则会自动创建数据库
uni.$sql.connect({
    name: 'local',// 数据库名称
    path:'_doc/local.db', // 路径
});

创建Model模型

//3.创建Model(表格模型:负责增删改查)
//如果table表格存在则连接,不存在则自动创建
let studentModel = uni.$sql.model('student',{
    name:String,
    age:{
        type: Number,
        default: 18
    }
});

约束

使用对象时,以约束模式处理,此时对象type为类型。 使用一下内容,为约束。 default需要设置默认值,如:{default: 0}check需要设置条件,如:{check:'age>18'}

  • check CHECK 检查
  • primaryKey PRIMARY KEY 主键
  • unique UNIQUE 不重复
  • default DEFAULT 默认值
  • notNull NOT NULL 非空
  • autoIncrement AUTOINCREMENT 自增

自增

存在多个主键的时候无法使用自增,自增只能存在于单个主键的时候 联合主键

在两列的约束同时设置primaryKey值为true时,可以创建联合主键。

如果没有主键,会自动添加主键usql_id(已经移除)

调用 API 执行操作

//4.调用API:添加数据
studentModel.insert({name:'张三10',age:30},(err,results)=>{
    console.log(err);
    console.log(results);
    if(!err) console.log('增加成功');
});

API 文档

1.1 增加操作

studentModel.insert({name:'张三10',age:30},(err,results)=>{
    console.log(err);
    console.log(results);
    if(!err) console.log('增加成功');
});

批量增加

var arr = [];
for (var i = 1; i <= 10; i++) {
    arr.push({ name: '张三', age: 30 })
}

studentModel.insert(arr, (err, results) => {
    console.log(err);
    console.log(results);
    if (!err) console.log('增加成功');
});

v2.1.0 感谢 @风扬 新增了事件选项(options, index),因为批量增加是遍历数组依次执行,所以callback回执行多次,可以使用第三,第四个(options, index)参数,判断是哪一个添加的数组出现了问题 例如:


studentModel.insert(arr, (err, results, option, index) => {
   console.log(err);
   console.log(results);
   if (!err) console.log('增加成功');
   console.log(`第${index}条数据出现问题,姓名是:${option.name}`) // index 从0开始
});

1.2-查询操作

1-查询所有数据

//2.1 查询所有数据
studentModel.find((err,results)=>{
    console.log(results);
});

2-查询数据库指定字段数据

//2.2 根据数据库字段查询部分数据
// ['name'] : 将要查询的字段放入数组中
studentModel.find(['name'],(err,results)=>{
    console.log(results);
});

3-条件查询

//2.3 根据条件查询数据
// 'id=1' : 查询id为1的数据 (查询条件可以参考sql语句)
//例如 'age>10' : 查询age超过10的数据 
//例如 'name>"张三"' : 查询名字为张三的数据,注意字符串添加引号
studentModel.find('id>21',(err,results)=>{
    console.log(results);
});

4-分页查询

//2.4 分页查询
//  第一个参数options对象有三个属性 {where:分页查询条件(可选), number:页数 , count:每页数量}
studentModel.limit({where:'age>28',number:1,count:10},(err,results)=>{
    console.log(results);
});

1.3-多表查询

Join 用于结合两个或多个数据库中表的记录。 有三种链接形式: 交叉连接 - CROSS JOIN 连接的两个表所有数据行的笛卡尔积 内连接 - INNER JOIN 只返回 左表在右表中有有匹配的行。 外连接 - OUTER JOIN 返回左表所有的行,即使在右表中没有匹配的行

studentModel.join(  // 左表
    resultModel,    // 右表
    {
        where: 'grade<60',  // 筛选条件
        type: 'inner',      // 链接模式
        predicate: {        // 谓语匹配词语
            left: 'id',     // 左表
            right: 'id'     // 右表
        }
    }, 
    function(e, r){

    })

1.4-修改操作

1-修改所有数据

//3.1 将数据库中所有的name字段值:修改为李四
studentModel.update({name:'李四'},(err,results)=>{
    console.log(results);
});

2-条件修改

//3.2 将数据库中 id = 1 的数据,age修改为30
studentModel.update('id=1',{age:30},(err,results)=>{
    console.log(results);
});

//3.3 将数据库中所有 age < 20 的数据,name修改为王五
studentModel.update('age<20',{name:'王五'},(err,results)=>{
    console.log(results);
});

1.5-删除操作

//4.1 删除所有 age>30 的数据
studentModel.delete('age>20',(err,results)=>{
    console.log(results);
});

//4.2 清空表中所有数据
studentModel.delete((err,results)=>{
    console.log(results);
});

1.6-执行自定义SQL语句

studentModel.sql('insert into student(name,age) values("andy",20)',(err,results)=>{
    console.log(results);
});

1.7-删除表格(慎用)

studentModel.drop((err,results)=>{
    console.log(results);
});

1.8-创建表格(慎用)

studentModel.create((err,results)=>{
    console.log(results);
});

1.9-数据库是否存在Model对应的数据表(慎用)

studentModel.isExist((err,results)=>{
    console.log(results);
});

1.10-链式语法支持

studentModel.insert({name:'张三22',age:22},(err,results)=>{
    console.log(err);
    console.log(results);
})
.find('name="张三22"',(err,results)=>{
    console.log(err);
    console.log(results);
});

1.11-表的相关操作 (慎用)

// 8.1 重命名
studentModel.alter('student_bak',(err,results)=>{
    console.log(err);
    console.log(results);
})
// 8.2 新增单列
studentModel.alter({name:'id', option:Number},(err,results)=>{
    console.log(err);
    console.log(results);
})
// 8.3 新增多列
studentModel.alter([
    {name:'id', option:Number}, // option 可以使用约束模式
    {name:'xx', option:Number},
    {name:'xxx', option:Number}
],(err,results)=>{
    console.log(err);
    console.log(results);
})

JS类型转存SQLite时如何处理

参考: sqliet数据类型 总结来说就是大部分都转化成了TEXT格式进行存储。

if (option[key] == Number) {
str += `'${key}' numeric,`;
} else if (option[key] == Date) {
str += `'${key}' timestamp,`;
} else {
str += `'${key}' varchar,`;
}

Number usqlite 会将Number数据类型转换numeric,但是sqlite会根据数据是否可逆,转化为INTEGER(带符号的整数)或者REAL(8 字节的 IEEE 浮点数). 其他内容 usqlite 会将其他数据类型转化varchar,sqlite会将其转化为TEXT

Q&A

  1. db 文件存放在什么位置? 答: 如果是_doc的话存放存放位置参考H5+ Api - PRIVATE_DOC。 如果是其他路径,请参考H5+ Api - SQLite
  1. 后续更新其他api会不会不兼容当然版本?

    答: 在后续版本中,始终会兼容当前版本。

  2. 为什么兼容性这么差,只兼容APP版本吗?后续会不会兼容其他版本?

    答: 由于H5+ plus API限制,当前版本只支持APP,后续版本会兼容其他内容,但是兼容其他版本就不能使用Sqlite,而是使用其他Storage或者其他内容进行兼容处理部分api将不支持,特别是自定sql的api。 并且这个这些功能会在后期在开发,可能要到年后或者什么时候,我近期开发Sqlite的App可视化插件。

隐私、权限声明

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

sqlite

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

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

许可协议

MIT协议

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