uni-app集成sqlite

news2025/2/27 15:32:16
Sqlite

SQLite 是一种轻量级的关系型数据库管理系统(RDBMS),广泛应用于各种应用程序中,特别是那些需要嵌入式数据库解决方案的场景。它不需要单独的服务器进程或系统配置,所有数据都存储在一个单一的普通磁盘文件中,这使得它非常适合用于开发小型到中型的应用程序。

作用

一般用于app离线缓存

集成方法

第一步勾选中SQLite 模块
在这里插入图片描述

第二步
我将代码都放到了一个文件夹里
在这里插入图片描述

index.js 该文件参考网上来源

let dbName = 'transfer'
/*
 * 打开数据库或者创建数据库
 */
export const openDb = () => {
	return new Promise((resolve, reject) => {
		if (isOpen()) {
			resolve()
			return
		}
		plus.sqlite.openDatabase({
			name: dbName,
			path: `_doc/storage/${dbName}.db`,
			success: (db) => {
				console.log('打开数据库成功', db)
				resolve(db)
			},
			fail: (e) => {
				console.log('打开数据库失败', e)
				reject(e)
			},
		})
	})
}
/*
 * 创建表,执行sql语句
 * @param {String} tableName 表名
 * @param {String} data 表结构
 */
export const createTable = (tableName, data) => {
	return new Promise(async (resolve, reject) => {
		if (!tableName || !data) {
			return
		}
		let flag = await isTable(tableName)

		if (flag) {
			resolve(true)
			return
		}
		plus.sqlite.executeSql({
			name: dbName,
			sql: `CREATE TABLE IF NOT EXISTS ${tableName} ${data}`,
			success: (e) => {
				console.log('创建表成功', e)
				resolve(e)
			},
			fail: (e) => {
				console.log('创建表失败', e)
				reject()
			},
		})
	})
}
/*

 * 判断表是否存在
 * @param {String} tableName 表名
 */
export const isTable = (tableName) => {
	return new Promise((resolve, reject) => {
		if (!tableName) {
			return
		}
		plus.sqlite.selectSql({
			name: dbName,
			sql: `SELECT name FROM sqlite_master WHERE type='table' AND name='${tableName}'`,
			success: (e) => {
				console.log('查询表成功', e)
				resolve(e.length ? true : false)
			},
			fail: (e) => {
				console.log('查询表失败', e)
				reject(e)
			},
		})
	})
}
/*
 * 删除表
 * @param {String} tableName 表名
 */
export const deleteTable = (tableName) => {
	return new Promise((resolve, reject) => {
		if (!tableName) {
			return
		}
		plus.sqlite.executeSql({
			name: dbName,
			sql: `DROP TABLE IF EXISTS ${tableName}`,
			success: (e) => {
				console.log('删除表成功', e)
				resolve(e)
			},
			fail: (e) => {
				console.log('删除表失败', e)
				reject(e)
			},
		})
	})
}
/*
 * 删除所有表数据
 */
export const deleteTableData = (tableName, whereSql) => {
	if (!tableName) {
		return
	}
	let sql = `DELETE FROM ${tableName}`
	if (whereSql) {
		sql = `DELETE FROM ${tableName} WHERE ${whereSql}`
	}
	return new Promise((resolve, reject) => {
		plus.sqlite.executeSql({
			name: dbName,
			sql,
			success: (e) => {
				console.log('删除表数据成功', e)
				resolve(e)
			},
			fail: (e) => {
				console.log('删除表数据失败', e)
				reject(e)
			},
		})
	})
}

/*
 * 查询所有表
 */

export const getTable = () => {
	return new Promise((resolve, reject) => {
		plus.sqlite.selectSql({
			name: dbName,
			sql: `SELECT name FROM sqlite_master WHERE type='table'`,
			success: (e) => {
				console.log('查询表成功', e)
				resolve(e)
			},
			fail: (e) => {
				console.log('查询表失败', e)
				reject(e)
			},
		})
	})
}
/*
 * 插入数据
 * @param {String} tableName 表名
 * @param {Object} data 数据
 */
export const insertData = (sql) => {

	return new Promise((resolve, reject) => {
		plus.sqlite.executeSql({
			name: dbName,
			sql: sql,
			success: (e) => {
				console.log('插入数据成功', e)
				resolve(e)
			},
			fail: (e) => {
				console.log('插入数据失败', e)
				reject(e)
			},
		})
	})
}

/*
 * 查询数据
 * @param {String} tableName 表名
 */
export const selectData = (tableName) => {
	return new Promise((resolve, reject) => {
		if (!tableName) {
			return
		}
		plus.sqlite.selectSql({
			name: dbName,
			sql: `SELECT * FROM ${tableName}`,
			success: (e) => {
				console.log('查询数据成功', e)
				resolve(e)
			},
			fail: (e) => {
				console.log('查询数据失败', e)
				reject(e)
			},
		})
	})
}
/*
 * 判断数据库是否打开
 */
export const isOpen = () => {
	let open = plus.sqlite.isOpenDatabase({
		name: dbName,
		path: `_doc/storage/${dbName}.db`,
	})
	console.log('数据库是否打开', open)
	return open
}
/*
 * 关闭数据库
 */
export const closeDb = () => {
	return new Promise((resolve, reject) => {
		plus.sqlite.closeDatabase({
			name: dbName,
			path: `_doc/storage/${dbName}.db`,
			success: (e) => {
				console.log('关闭数据库成功', e)
				resolve(e)
			},
			fail: (e) => {
				console.log('关闭数据库失败', e)
				reject(e)
			},
		})
	})
}

export const sqlite = {
	openDb,
	createTable,
	isTable,
	isOpen,
	closeDb,
	insertData,
	selectData,
	getTable,
	deleteTable,
	deleteTableData,
}

work.js

import {
	sqlite
} from './index.js'

export default class WorkSqlite {
	constructor(tableName) {
		this.tableName = tableName
	}
	/*
	 * 初始化数据库
	 * @param {String} tableName 表名
	 * @param {String} sql 表结构
	 */
	initSqlite(sql = '("id" TEXT,"content" TEXT)') {
		return new Promise((resolve, reject) => {
			sqlite.openDb().then(async () => {
				let table = await sqlite.createTable(this.tableName, sql).catch(() => {
					reject(false)
				})
				if (table) {
					resolve(true)
				} else {
					reject(false)
				}
			})
		})
	}
	/*
	 * 插入单条数据
	 * @param {String} tableName 表名
	 * @param {Object} data 数据
	 */
	insertData(data) {
		let keys = Object.keys(data)
		let values = Object.values(data)
		let sql =
			`INSERT INTO ${this.tableName} (${keys.join(',')}) VALUES (${values.map((item) => `'${item}'`).join(',')})`
		return sqlite.insertData(sql)
	}
	/*
	 * 查询数据
	 * @param {String} tableName 表名
	 */
	selectData() {
		return sqlite.selectData(this.tableName)
	}
	/*
	 * 删除表数据
	 */

	deleteTableData(where = null) {
		return sqlite.deleteTableData(this.tableName, where)
	}
	/*
	 * 删除表
	 */
	deleteTable(tableName) {
		return sqlite.deleteTable(tableName)
	}
	closeDb() {
		return sqlite.closeDb()
	}
	/*
	 * 查询所有表
	 */
	getTable() {
		return sqlite.getTable()
	}
	/*
	 * 批量插入数据
	 * @param {String} tableName 表名
	 * @param {Object} data 数据
	 */
	insertBatchData(data) {

		if (!Array.isArray(data) || !data?.length) {
			console.log('插入数据必须是数组')
			return
		}
		let sql = []

		data.forEach((item) => {
			let keys = Object.keys(item)
			let values = Object.values(item)
			sql.push(
				`INSERT INTO ${this.tableName} (${keys.join(',')}) VALUES (${values.map((item) => `'${item}'`).join(',')})`
			)
		})

		return sqlite.insertData(sql)
	}
	/*
	 * 判断数据库是否连接
	 * @param {String} tableName 表名
	 */
	async isConnect() {
		let open = sqlite.isOpen()
		if (!open) {
			return false
		}

		let table = await sqlite.isTable(this.tableName)
		if (!table) {
			return false
		}
		return true
	}

}

使用示例:

import WorkSqlite from '@/sqlite/work.js';
export default {
 data(){
   return {
    workPending: null,
	workRuning: null
   }
  },
 	onLoad(e) {
		// 初始化待处理任务数据库链接,传入的是表名,需要几个表就new 几个。
		this.workPending = new WorkSqlite('workPending');
		this.workRuning = new WorkSqlite('workRuning');
	},
}

修改表设计需要自己传入sql语法,initSqlite时传入sql语句即可自定义表设计。

在这里插入图片描述

默认支持数据批量插入,表字段只有 id 和 content

在这里插入图片描述

最后如果sqlite 没生效,可能需要打自定义基座。sqlite 只适合app,H5不支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2306945.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HTML— 快速入门】HTML 基础

准备工作 vscode下载 百度网盘 Subline Text 下载 Sublime Text下载 百度网盘 vscode 下载 Sublime Text 是一款轻量好用的文本编辑器,我们在写前端代码时,使用 Sublime Text 打开比使用记事本打开,得到的代码体验更好,比 vscode…

【MATLAB中的图像数据结构】

MATLAB中的图像数据结构 目录 MATLAB中的图像数据结构目标 :知识点 :1. 图像的存储方式 :2. 图像的颜色空间 :3. 图像的像素操作 : 示例代码 :1. 读取和显示图像 :2. 查看图像信息 :…

在线抽奖系统——项目介绍

目录 项目介绍 页面预览 需求分析 管理员登录注册 人员模块 奖品模块 活动模块 抽奖模块 系统设计 系统架构 项目环境 数据库设计 安全设计 完整代码:项目完整代码/在线抽奖系统/lottery-system Echo/project - 码云 - 开源中国 项目介绍 利用 MySQ…

JavaScript 系列之:Ajax、Promise、Axios

前言 同步:会阻塞。同步代码按照编写的顺序逐行依次执行,只有当前的任务完成后,才会执行下一个任务。 异步:异步代码不会阻塞后续代码的执行。当遇到异步操作时,JavaScript 会将该操作放入任务队列中,继续…

鸿蒙开发深入浅出01(基本环境搭建、页面模板与TabBar)

鸿蒙开发深入浅出01(基本环境搭建、页面模板与TabBar) 1、效果展示2、下载 DevEco Studio3、创建项目4、新建页面模板5、更改应用信息6、新建以下页面7、Index.ets8、真机运行9、图片资源文件 1、效果展示 2、下载 DevEco Studio 访问官网根据自己的版本…

FreeRTOS动态任务和静态任务创建

一.动态任务创建 1.搭建任务框架 去task.c中将任务参数复制到main中 然后将const去掉,它会限制参数类型,任务大小、任务优先级、任务句柄需要去宏定义,任务句柄是指针类型要取地址 vTaskStartScheduler(); //开启任务调度,.c…

QT:Graphics View的坐标系介绍

在 Qt 的 Graphics View 框架中,存在三种不同的坐标系,分别是 物品坐标系(Item Coordinates)、场景坐标系(Scene Coordinates) 和 视图坐标系(View Coordinates)。这三种坐标系在图形…

C# httpclient 和 Flurl.Http 的测试

关于C#调用接口或Post,Flurl封装了httpclient, CSDN有哥们提供了一个公网的测试网站,可以测试Post调用,我写了2个函数,测试httpclient和Flurl使用Post: async 和 await 是成对使用的,为了接受web异步返回的数据,winfor…

精选案例展 | 智己汽车—全栈可观测驱动智能化运营与成本优化

本案例为“观测先锋 2024 可观测平台创新应用案例大赛”精选案例,同时荣获IT168“2024技术卓越奖评选-年度创新解决方案”奖。 项目背景 近年来,中国汽车行业进入转型升级阶段,智能网联技术成为行业发展的核心。车联网、自动驾驶等技术的加速…

阿里云可观测全面拥抱 OpenTelemetry 社区

作者:古琦 在云计算、微服务、容器化等技术重塑 IT 架构的今天,系统复杂度呈指数级增长。在此背景下,开源可观测性技术已从辅助工具演变为现代 IT 系统的"数字神经系统",为企业提供故障预警、性能优化和成本治理的全方…

山大软院ai导论实验之采用BP神经网络分类MNIST数据集

目录 实验代码 实验内容 实验代码 import matplotlib.pyplot as plt from matplotlib import font_manager import torch from torch.utils.data import DataLoader import torchvision from torchvision import transforms# 数据预处理 transform transforms.Compose([tra…

threeJs+vue 轻松切换几何体贴图

嗨,我是小路。今天主要和大家分享的主题是“threeJsvue 轻松切换几何体贴图”。 想象一下,手头上正好有个在线3D家具商店,用户不仅可以看到产品的静态图片,还能实时更换沙发的颜色或材质,获得真实的购物体验。…

【python】01_写在前面的话

又是爆肝干文的日子,继上次说要出一期Python新手入门教程系列文章后,就在不停地整理和码字,终于是把【基础入门】这一块给写出来了。 不积跬步无以至千里,不积小流无以成江海,一个一个板块的知识积累,早晚你…

跨平台公式兼容性大模型提示词模板(飞书 + CSDN + Microsoft Word)

飞书云文档 CSDN MD编辑器 Microsoft Word 跨平台公式兼容方案: 一、背景痛点与解决方案 在技术文档创作中,数学公式的跨平台渲染一直存在三大痛点: 飞书云文档:原生KaTeX渲染与导出功能存在语法限制微软Word:Math…

深入理解 并查集LRUCaChe

并查集&LRUCaChe 个人主页:顾漂亮 文章专栏:Java数据结构 1.并查集的原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后根据一定规律将归于同一组元素的…

最新版本SpringAI接入DeepSeek大模型,并集成Mybatis

当时集成这个环境依赖冲突&#xff0c;搞了好久&#xff0c;分享一下依赖配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…

滑动验证组件-微信小程序

微信小程序-滑动验证组件&#xff0c;直接引用就可以了&#xff0c;效果如下&#xff1a; 组件参数&#xff1a; 1.enable-close&#xff1a;是否允许关闭&#xff0c;默认true 2.bind:onsuccess&#xff1a;验证后回调方法 引用方式&#xff1a; <verification wx:if&qu…

IDEA配置JSP环境

首先下载IDEA2021.3&#xff0c;因为最新版本不能简单配置web开发环境。然后新建一个java开发项目&#xff1a; 然后右键创建的项目&#xff0c;添加web框架&#xff1a; 选择web appliciation 在web inf文件夹下创建classes和lib文件夹&#xff1a; 点击file &#xff0c;选择…

Idea 中 Project Structure简介

在 IntelliJ IDEA 中&#xff0c;Project Structure&#xff08;项目结构&#xff09;对话框是一个非常重要的配置界面&#xff0c;它允许你对项目的各个方面进行详细的设置和管理。下面将详细介绍 Project Structure 中各个主要部分的功能和用途。 1. Project&#xff08;项…

旁挂负载分担组网场景

旁挂负载分担组网场景&#xff08;到路由策略&#xff09; 1.拓扑 2.需求 使用传统三层架构中MSTPVRRP组网形式VLAN 2—>W3,SW4作为备份 VLAN 3—>SW4,SW3作为备份 MSTP设计—>SW3、4、5运行 实例1:VLAN 2 实例2:VLAN 3 3.配置 交换层 SW3配置 抢占延时&#xff…