关于uni-app使用sqlite来做App的本地缓存

6,562 阅读3分钟

对于开发项目使用到的本地存储,一般用缓存storage就足够了,但是如果碰到数据量比较大的情况下,就需要使用sqlite数据库来进行数据的存储了。

问题

比如我碰到的一个业务,因为操作环境是处于断网的情况下,所以用户的数据需要存储到本地,数据包括一系列文字内容和图片;所以,我采用了分开存储的方法,图片存在相册里,包括图片路径的其他数据存到sqlite。

sqlite

开始写业务之前,我们得了解uni-app是怎么使用sqlite的,uni-app内置的sqlite方法目前一共有6个:
注意:HBuilderX1.7.2及以上版本支持此功能。

打开/创建数据库

void plus.sqlite.openDatabase(options)

这个api需要传入一个至少包含namepath的对象,name为数据库名称,path为数据库的地址,官方推荐的是以_doc/为开始,例如doc/demo.db
示例代码:

function openDatabase () {
    return new Promise((resolve, reject) => {
        plus.sqlite.openDatabase({
            name: 'demo',
            path: '_doc/demo.db',
            success: () => {
                resolve('ok.')
            },
            fail: () => {
                reject('fail.')
            }
        })
    })
}

判断数据库是否打开

Boolean plus.sqlite.isOpenDatabase(options)

这个api用于判断数据库是否开启,因为数据库打开的情况下,再次打开是会走失败的回调函数的,所以再打开数据前,应当判断当前状态;传入的对象也是包含namepath两个必填参数,返回值为Boolean。 示例代码:

const isOpen = plus.sqlite.isOpenDatabase({
    name: 'demo',
    path: '_doc/demo.db'
})

关闭数据库

void plus.sqlite.closeDatabase(options)

关闭数据库,传入必填参数name和选填参数success以及fail

执行查询语句

void plus.sqlite.selectSql(options)

这个api用于查询表数据用,除了namesuccessfail等参数外,需要传入sql参数,sql是一条sql语句(基本同mysql的语法一致)。
示例代码:

function findData () {
    return new Promise((resolve, reject) => {
        plus.sqlite.selectSql({
            name: 'demo',
            sql: 'select * from users',
            success: data => {
                resolve(data)
            },
            fail: () => {
                reject('fail.')
            }
        })
    })
}

selectSql这个方法的success回调函数的返回参数是有值的,即数据库查询出来的数据,其格式为JSON对象数组,没有数据的话就是一个空数组。

执行增删改创建表等语句

void plus.sqlite.executeSql(options)

selectSql类似,也是需要传入sql字段,但是这里有所不同的是,executeSql传入的sql除了是一个字符串类型外,还可以是字符串数组,表示执行多次操作。
示例代码:

function createUsers () {
    return new Promise((resolve, reject) => {
        plus.sqlite.executeSql({
            name: 'demo',
            sql: `
            create table if not exists users (
                "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL COMMENT "唯一ID",
                "name" varchar(32) NOT NULL COMMENT "名称"
            )
            `,
            success: () => {
                resolve('ok.')
            },
            fail: () => {
                reject('fail.')
            }
        })
    })
}
return new Promise((resolve, reject) => {
        plus.sqlite.executeql({
            name: 'demo',
            sql: `insert into users (name) values ('lihua')`,
            success: () => {
                plus.sqlite.selectSql({
                    name: 'demo',
                    sql: 'select last_insert_rowid()',
                    success: data => {
                        // 获取插入后的主键id
                        resolve(data)
                    }
                })
            },
            fail: () => {
                reject('fail.')
            }
        })
    })

开启事务

这个就是保证数据的一致性和原子性的,简单点来说,就是在一个事务里面做的多次sql操作,要么都成功,要么都不成功。

void plus.sqlite.transaction(options)

namesuccessfail外多一个operation参数,一共有三个值:begin(开始事务)、commit(提交)、rollback(回滚)。需要注意的是,开启事务后得记住关闭事务,要么提交要么回滚(回滚一般在异常情况下执行)。

结束

uni-app提供操作sqlite的api还是非常简单的,当需要缓存大量数据的时候,就可以考虑使用这个了,需要注意的是:一但卸载的App的话sqlite的数据库会一起丢失。