uni-app 移动端本地储存数据库sqlite

解析

bash 复制代码
1.移动端使用setStorage存储数据一般是2M或5M,存储到本地的数据无2.限制,必须使用移动端SQLite数据库。
SQLite模块用于操作本地数据库文件,可实现数据库文件的创建,执行SQL语句等功能。

方法

bash 复制代码
openDatabase: 打开数据库
isOpenDatabase: 判断数据库是否打开
closeDatabase: 关闭数据库
transaction: 执行事务
executeSql: 执行增删改等操作的SQL语句
selectSql: 执行查询的SQL语句

回调方法

bash 复制代码
SQLiteSuccessCallback: SQLite操作成功回调函数
SQLiteFailCallback: SQLite操作失败回调函数

开始使用:

1.manifest.json勾选sqlite权限。

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

bash 复制代码
{
// ...
"permissions":{
	// ...
	"SQLite": {
		"description": "SQLite数据库"
	}
}
}

模版代码

bash 复制代码
<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>

封装模块代码

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

bash 复制代码
//创建/打开数据库。不存在则创建并打开,存在则打开
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
}
相关推荐
Elastic 中国社区官方博客1 小时前
在 Elasticsearch 中使用 Mistral Chat completions 进行上下文工程
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
编程爱好者熊浪3 小时前
两次连接池泄露的BUG
java·数据库
TDengine (老段)5 小时前
TDengine 字符串函数 CHAR 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
qq7422349845 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
姚远Oracle ACE5 小时前
Oracle 如何计算 AWR 报告中的 Sessions 数量
数据库·oracle
Dxy12393102166 小时前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎6 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
杨云龙UP6 小时前
【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)
linux·运维·数据库·mysql·mssql
l1t6 小时前
利用DeepSeek辅助修改luadbi-duckdb读取DuckDB decimal数据类型
c语言·数据库·单元测试·lua·duckdb
安当加密6 小时前
Nacos配置安全治理:把数据库密码从YAML里请出去
数据库·安全