uni 您所在的位置:网站首页 uniapp云开发数据库有多大 uni

uni

2024-01-09 00:09| 来源: 网络整理| 查看: 265

对于移动端,我们使用setStorage存储数据,但是这种方法总是有存储大小的限制,一般是2M或5M,如果我们希望存储到本地的数据无限制,就像微信聊天的消息一样,那么我们就必须使用移动端SQLite数据库。

SQLite模块用于操作本地数据库文件,可实现数据库文件的创建,执行SQL语句等功能。

官方文档位置:

HTML5+ API Reference

方法: openDatabase: 打开数据库isOpenDatabase: 判断数据库是否打开closeDatabase: 关闭数据库transaction: 执行事务executeSql: 执行增删改等操作的SQL语句selectSql: 执行查询的SQL语句 回调方法: SQLiteSuccessCallback: SQLite操作成功回调函数SQLiteFailCallback: SQLite操作失败回调函数 需要打开sqlite的权限:

1.manifest.json勾选sqlite权限。

2.也可以通过修改json配置文件。 

{ // ... "permissions":{ // ... "SQLite": { "description": "SQLite数据库" } } } 示例测试代码:

{odb}} --> 判断数据库是否打开 打开数据库 关闭数据库 创建表 删除表 执行事务 新增数据 批量新增数据 删除所有数据 查询数据 // 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)); } }); }, } } 封装模块代码:

你可以根据自己的需求,修改部分代码。

//创建/打开数据库。不存在则创建并打开,存在则打开 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 }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有