uni-app 移动端本地储存数据库sqlite,无存储限制
对于移动端,我们使用setStorage存储数据,但是这种方法总是有存储大小的限制,一般是2M或5M,如果我们希望存储到本地的数据无限制,就像微信聊天的消息一样,那么我们就必须使用移动端SQLite数据库。SQLite模块用于操作本地数据库文件,可实现数据库文件的创建,执行SQL语句等功能。官方文档位置:HTML5+ API Reference方法:openDatabase: 打开数据库isOpe
·
对于移动端,我们使用setStorage存储数据,但是这种方法总是有存储大小的限制,一般是2M或5M,如果我们希望存储到本地的数据无限制,就像微信聊天的消息一样,那么我们就必须使用移动端SQLite数据库。
SQLite模块用于操作本地数据库文件,可实现数据库文件的创建,执行SQL语句等功能。
官方文档位置:
方法:
- openDatabase: 打开数据库
- isOpenDatabase: 判断数据库是否打开
- closeDatabase: 关闭数据库
- transaction: 执行事务
- executeSql: 执行增删改等操作的SQL语句
- selectSql: 执行查询的SQL语句
回调方法:
- SQLiteSuccessCallback: SQLite操作成功回调函数
- SQLiteFailCallback: SQLite操作失败回调函数
需要打开sqlite的权限:
1.manifest.json勾选sqlite权限。
2.也可以通过修改json配置文件。
{
// ...
"permissions":{
// ...
"SQLite": {
"description": "SQLite数据库"
}
}
}
示例测试代码:
<template>
<view class="">
<!-- <div>{{odb}}</div> -->
<div>
<button type="default" @click="isOpenDatabase">判断数据库是否打开</button>
<button type="default" @click="openDatabase">打开数据库</button>
<button type="default" @click="closeDatabase">关闭数据库</button>
<button type="default" @click="createChatTable">创建表</button>
<button type="default" @click="dropTable">删除表</button>
<button type="default" @click="transaction">执行事务</button>
<button type="default" @click="insertChatRow">新增数据</button>
<button type="default" @click="insertListChatRow">批量新增数据</button>
<button type="default" @click="deleteChatRow">删除所有数据</button>
<button type="default" @click="selectSql">查询数据</button>
</div>
</view>
</template>
<script>
// import Sqlite from '../../utils/sqllite.js'
export default {
data() {
return {
// odb:'',
dbName: 'dianji_chat',
dbPath: '_doc/dianji_chat.db',
dbTable: 'dianji_chat',
dbIsOpen: false,
chatText: {
id: 1,
fromId: '123',
toId: '321',
content: '你好!',
flag: 1
},
chatText1: [
{
id: 11,
fromId: '123',
toId: '321',
content: '你好!',
flag: 1
},
{
id: 12,
fromId: '123',
toId: '321',
content: '你好!',
flag: 1
}
],
}
},
onLoad() {
// console.log('Sqlite:',Sqlite)
// this.open();
},
methods: {
// async open(){
// let odb=await Sqlite.openSqlite();
// this.odb=odb;
// console.log('打开数据库成功:',odb)
// },
createChatTable() {
let sql = 'CREATE TABLE if not exists ' + this.dbTable +
' ( "id" varchar(32) NOT NULL,"content" varchar(1024),"fromId" varchar(32), "toId" varchar(32), "flag" varchar(2), PRIMARY KEY ("id"));'
this.executeSql(sql)
},
openDatabase() {
plus.sqlite.openDatabase({
name: this.dbName,
path: this.dbPath,
success: function(e) {
console.log('打开数据库成功')
},
fail: function(e) {
console.log(e,'打开数据库失败')
}
});
},
isOpenDatabase() {
let res = plus.sqlite.isOpenDatabase({
name: this.dbName,
path: this.dbPath
});
if (res) {
console.log(res,'数据库已打开')
} else {
console.log(res,'数据库未打开')
}
},
closeDatabase() {
plus.sqlite.closeDatabase({
name: this.dbName,
success: function(e) {
console.log(JSON.stringify(e),'closeDatabase dianji_chat success!');
},
fail: function(e) {
console.log('closeDatabase failed: ' + JSON.stringify(e));
}
});
},
insertChatRow() {
let data = this.chatText
data.id++
let sql = "insert into " + this.dbTable + " values('" + data.id + "','" + data.content +
"','" + data.fromId + "','" + data.toId + "'," + data.flag + ")";
this.executeSql(sql)
},
insertListChatRow() {
let data = this.chatText1
let sql = '';
for(let i = 0; i < data.length; i++) {
sql = "insert into " + this.dbTable + " values('" + data[i].id + "','" + data[i].content +
"','" + data[i].fromId + "','" + data[i].toId + "'," + data[i].flag + ")";
this.executeSql(sql)
}
},
deleteChatRow() {
let sql = "delete from " + this.dbTable;
this.executeSql(sql)
},
selectSql() {
let curPage = 1
let pageSize = 20
let fromId = '123'
let sql = 'select * from ' + this.dbTable + ' where fromId=' + fromId +
' limit ' + pageSize + ' offset ' + (curPage - 1) * pageSize;
this.executeSql(sql)
},
dropTable() {
let sql = 'DROP TABLE ' + this.dbTable + ';'
plus.sqlite.executeSql({
name: this.dbName,
sql: sql,
success: function(e) {
console.log("删除数据表成功");
},
fail: function(e) {
console.log('executeSql failed: ' + JSON.stringify(e));
}
})
},
transaction(){
plus.sqlite.transaction({
name: this.dbName,
operation: 'begin',
success: function(e){
console.log('transaction success!');
},
fail: function(e){
console.log('transaction failed: '+JSON.stringify(e));
}
});
},
executeSql(sql) {
plus.sqlite.selectSql({
name: this.dbName,
sql: sql,
success: function(data) {
console.log(data,'---------------')
},
fail: function(e) {
console.log('selectSql failed: ' + JSON.stringify(e));
}
});
},
}
}
</script>
<style>
</style>
封装模块代码:
你可以根据自己的需求,修改部分代码。
//创建/打开数据库。不存在则创建并打开,存在则打开
function openSqlite(){
//这plus.sqlite只在手机APP上运行,记得要在打包模块设置勾选“sqlite”数据库。
return new Promise((resolve,reject) =>{
plus.sqlite.openDatabase({
name:'pop', //数据库名称
path:'_doc/pop.db', //数据库地址,uniapp推荐以下划线为开头
success(e){
resolve(e); //成功回调
},
fail(e){
reject(e); //失败回调
}
})
})
}
//在该数据库里创建表格
//userInfo是表格名。
//括号里是表格的结构,列,这里我写了四列,list,id,gender,avatar这四列
//list后面大写的英文是自动增加的意思,因为表格里的每一行必须有唯一标识
//这sql语句会数据库的应该都看的懂,我是前端菜鸡,所以详细说明以便跟我一样不懂sql的前端看
//"id" TEXT 意思是这一列放的值为字符串之类的,如果是想存数字之类的就改为INTEGER
//数据库不能存对象,数组
function userInfoSQL(){
return new Promise((resolve,reject) =>{
//创建表格在executeSql方法里写
plus.sqlite.executeSql({
name:'pop',
//表格创建或者打开,后面为表格结构
sql:'create table if not exists userInfo("list" INTEGER PRIMARY KEY AUTOINCREMENT,"id" TEXT,"name" TEXT,"gender" TEXT,"avatar" TEXT)',
success(e){
resolve(e);
},
fail(e){
reject(e);
}
})
})
}
//向表格里添加数据
//根据表格的列来添加信息
//因为list列我设为自动增加,所以不用添加数据
//values里是传过来要存的值,我这里是动态的,单引号加双引号拼接
function addUserInformation(obj){
//判断有没有传参
if(obj !== undefined){
//判断传的参是否有值
var b = (JSON.stringify(obj) == "{}");
if(!b){
//obj传来的参数对象
var id = obj.id || null; //id
var name = obj.name || null; //名称
var gender = obj.gender || null; //性别
var avatar = obj.avatar || null; //头像
return new Promise((resolve,reject) =>{
plus.sqlite.executeSql({
name:'pop',
sql:'insert into userInfo(id,name,gender,avatar) values("'+id+'","'+name+'","'+gender+'","'+avatar+'")',
success(e){
resolve(e);
},
fail(e){
reject(e);
}
})
})
}else{
return new Promise((resolve,reject) =>{reject("错误添加")})
}
}else{
return new Promise((resolve,reject) =>{reject("错误添加")})
}
}
//查询获取数据库里的数据
//根据传过来的值来获取信息,我这里写了可以有两个条件来获取,都是动态的
//第一个参数为表格名,aa,bb分别为列名和列的值 , cc,dd同前面
//传的参数按1,3,5来传,传一个,传三个,传五个参数,不能只传两个或者四个
function selectInformationType(name,aa,bb,cc,dd){
if(name !== undefined){
//第一个是表单名称,后两个参数是列表名,用来检索
if(aa !== undefined && cc !== undefined){
//两个检索条件
var sql = 'select * from '+name+' where '+aa+'='+bb+' and '+cc+'='+dd+'';
}
if(aa !== undefined && cc == undefined){
//一个检索条件
var sql = 'select * from '+name+' where '+aa+'='+bb+'';
}
if(aa == undefined){
var sql = 'select * from '+name+'';
}
return new Promise((resolve,reject) =>{
plus.sqlite.selectSql({
name:'pop',
sql:sql,
success(e){
resolve(e);
},
fail(e){
reject(e);
}
})
})
}else{
return new Promise((resolve,reject) =>{reject("错误查询")});
}
}
//删除数据库里的数据
//参数跟上面查询获取数据一样
//传的参数按1,3,5来传,传一个,传三个,传五个参数,不能只传两个或者四个
function deleteInformationType(name,sol,qq,ww,ee){
if(name !== undefined && sol !== undefined){
//listId为表名,后面两个是列表名,检索用的
if(ww !== undefined){
//两个检索条件
var sql = 'delete from '+name+' where '+sol+'="'+qq+'" and '+ww+'='+ee+'';
}else{
//一个检索条件
var sql = 'delete from '+name+' where '+sol+'="'+qq+'"';
}
return new Promise((resolve,reject) =>{
plus.sqlite.executeSql({
name:'pop',
sql:sql,
success(e){
resolve(e);
},
fail(e){
reject(e);
}
})
})
}else{
return new Promise((resolve,reject) =>{reject("错误删除")});
}
}
//修改数据表里的数据
//第一个参数为表格名,name为要修改的列名,cont为要修改为什么值,use,sel为搜索条件,分别是列名和列值
//传的参数按1,3,5来传,传一个,传三个,传五个参数,不能只传两个或者四个
function modifyInformation(listName,name,cont,use,sel){
//表格名,要修改地方的列名,修改后的内容,修改条件查询,列名,内容
var sql;
if(use == undefined){
sql ='update '+listName+' set '+name+'="'+cont+'"';
}else{
sql ='update '+listName+' set '+name+'="'+cont+'" where '+use+'="'+sel+'"';
}
//where前面的是要修改的,后面的是条件,选择哪个
return new Promise((resolve,reject) =>{
plus.sqlite.executeSql({
name:'pop',
sql:sql,
success(e){
resolve(e);
},
fail(e){
reject(e);
}
})
})
}
//关闭数据库
function closeSQL(name){
return new Promise((resolve,reject) =>{
plus.sqlite.closeDatabase({
name:'pop',
success(e){
resolve(e);
},
fail(e){
reject(e);
}
})
})
}
//监听数据库是否开启
function isOpen(name,path){
var ss = name || 'pop';
var qq = path || '_doc/pop.db';
//数据库打开了就返回true,否则返回false
var open = plus.sqlite.isOpenDatabase({
name:ss,
path:qq
})
return open;
}
//一次获取指定数据条数
//不想一次性把数据全拿过来就可以这样写
//id为表格名,desc代表倒序拿数据,正常是从第一条开始拿,倒序就从最后一条也是最新的一条数据开始拿
//limit 15 offset '+num+'',后面这是两个单引号,这句的意思是跳过多少条拿15条数据,num是动态值
//比如你刚开始给num设为0,那就从最后面的数据开始拿15条,你下次肯定不想再拿刚刚获取到的数据,所以可以让num为15,这样就能一步一步的拿完所有的数据
function pullSQL(id,num){
//id为表名,num为跳过多少条数据
//根据list来倒序拿数据,跳过num条拿取15条
return new Promise((resolve,reject) =>{
plus.sqlite.selectSql({
name:'pop',
sql:'select * from '+id+' order by list desc limit 15 offset '+num+'',
success(e){
resolve(e);
},
fail(e){
reject(e);
}
})
})
}
//把这些方法导出去
export default{
openSqlite,
userInfoSQL,
addUserInformation,
selectInformationType,
deleteInformationType,
pullSQL,
isOpen,
closeSQL,
modifyInformation
}
更多推荐
已为社区贡献1条内容
所有评论(0)