uni-app集成sqlite

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不支持!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python文件的基本操作,文件读写

1.文件 1.1文件就是存储在某种长期存储设备上的一段数据 1.2文件操作 打开文件-->读写文件-->关闭文件 注意:可以只打开和关闭文件不进行任何操作 1.3文件对象的方法 1.open():创建一个file对象,默认以只读模式打开 2.read(n):n表示从文件中…

半导体晶圆精控:ethercat转profient网关数据提升制造精度

数据采集系统通过网关连接离子注入机,精细控制半导体晶圆制造过程中的关键参数。 在半导体制造中,晶圆制造设备的精密控制是决定产品性能的关键因素。某半导体工厂采用耐达讯Profinet转EtherCAT协议网关NY-PN-ECATM,将其数据采集系统与离子注…

双臂机器人的动力学建模

双臂机器人的动力学建模是研究机器人在运动过程中的力学行为和动力学特性,主要目的是确定在给定的控制指令下,机器人各个关节或末端执行器所受的力与加速度之间的关系。建立动力学模型通常涉及以下几个步骤: 1. 定义机器人坐标系和关节空间 双…

驱动开发系列39 - Linux Graphics 3D 绘制流程(二)- 设置渲染管线

一:概述 Intel 的 Iris 驱动是 Mesa 中的 Gallium 驱动,主要用于 Intel Gen8+ GPU(Broadwell 及更新架构)。它负责与 i915 内核 DRM 驱动交互,并通过 Vulkan(ANV)、OpenGL(Iris Gallium)、或 OpenCL(Clover)来提供 3D 加速。在 Iris 驱动中,GPU Pipeline 设置 涉及…

中国的Cursor! 字节跳动推出Trae,开放Windows版(附资源),开发自己的网站,内置 GPT-4o 强大Al模型!

Trae是什么 Trae 是字节跳动推出的免费 AI IDE,通过 AI 技术提升开发效率。支持中文,集成了 Claude 3.5 和 GPT-4 等主流 AI 模型,完全免费使用。Trae 的主要功能包括 Builder 模式和 Chat 模式,其中 Builder 模式可帮助开发者从…

【洛谷排序算法】P1012拼数-详细讲解

洛谷 P1012 拼数这道题本身并非单纯考察某种经典排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序等)的实现,而是在排序的基础上,自定义了排序的比较规则,属于自定义排序类型的题目。不过它借助了标准库中…

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

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

STM32开发学习(三)----使用STM32CUBEMX创建项目

前言 开始正式接触代码,学习代码开发,先熟悉STM32CUBEMX软件,控制开发板的GPIO。(STM32F103C8T6)。 正式开始 1.打开软件 2.点击ACCESS TO MCU SELECTOR,进入软件选择,可能会弹出更新,等待更新完成即可。…

初识Skywalking

背景 筒子们,最近雷袭又接触到一项新工具:Skywalking,本着好东西要和大家分享的原则,在对它有了初步了解,草草的进行了实践之后,就迫不及待的把它推荐给大家了。在写本篇博客时,本人对Skywalkin…

【论文笔记】ClipSAM: CLIP and SAM collaboration for zero-shot anomaly segmentation

原文链接 摘要 近年来,CLIP 和 SAM 等基础模型在零样本异常分割 (ZSAS) 任务中展现出良好的性能。然而,无论是基于 CLIP 还是基于 SAM 的 ZSAS 方法,仍然存在不可忽视的关键缺陷:1) CLIP 主要关注不同输入之间的全局特征对齐&am…

1分钟用DeepSeek编写一个PDF转Word软件

一、引言 如今,在线工具的普及让PDF转Word成为了一个常见需求,常见的pdf转word工具有收费的wps,免费的有pdfgear,见下文: PDFgear:一款免费的PDF编辑、格式转化软件-CSDN博客 还有网上在线的免费pdf转word工具smallp…

内容中台的企业CMS架构是什么?

企业CMS模块化架构 现代企业内容管理系统的核心在于模块化架构设计,通过解耦内容生产、存储、发布等环节构建灵活的技术栈。动态/静态发布引擎整合技术使系统既能处理实时更新的产品文档,也能生成高并发的营销落地页,配合版本控制机制确保内…

【Uniapp-Vue3】开发userStore用户所需的相关操作

在项目根路径下创建的stores文件夹中创建user.js文件 并将以下内容复制到user.js中 import {ref} from "vue" import { defineStore } from pinia; const uniIdCo uniCloud.importObject("uni-id-co") const db uniCloud.database(); const usersTable…

PhotoShop学习01

了解Photoshop 这里省略了Photoshop的软件安装,请自行查找资源下载。 1.打开图片 下图为启动photoshop后出现的界面,我们可以通过创建新文件或打开已有文件来启用photoshop的工作界面。 可以通过左边的按钮进行新文件的创建或打开已有文件。 也可以点…

使用ZFile打造属于自己的私有云系统结合内网穿透实现安全远程访问

文章目录 前言1.关于ZFile2.本地部署ZFile3.ZFile本地访问测试4.ZFile的配置5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定ZFile公网地址 前言 在数字化的今天,我们每个人都是信息的小能手。无论是职场高手、摄影达人还是学习狂人,每天都在创造…

PyTorch 源码学习:GPU 内存管理之它山之石——TensorFlow BFC 算法

TensorFlow 和 PyTorch 都是常用的深度学习框架,各自有一套独特但又相似的 GPU 内存管理机制(BFC 算法)。它山之石可以攻玉。了解 TensorFlow 的 BFC 算法有助于学习 PyTorch 管理 GPU 内存的精妙之处。本文重点关注 TensorFlow BFC 算法的核…

Go语言--语法基础1

1、语言介绍 什么go语言 go(又称 Golang )是 Google开发的一种静态强类型、编译型、并发型,并具有 垃圾回收功能的编程语言. Go语言有一个吉祥物,下图所示的 Go Gopher 是加拿大的小动物,中文名叫作 囊地鼠 。 诞…

跟着官方文档学习UE C++ TArray容器系列 迭代

一.首先测试下&#xff0c;官方案例 迭代器的方法&#xff0c;有点不常见。有点像个指针&#xff0c;迭代完还自带break. oid AWXTArrayActor::WXLoopArray() {FString JoinedStr1;FString JoinedStr2;TArray<FString> StrArr { "Hello","Baby",&q…

esp工程报错:something went wrong when trying to build the project esp-idf 一种解决办法

最近上手了正点原子esp32s3板子&#xff0c;环境采用的是vscodeesp-idf插件。导入了正点原子的demo测试&#xff0c;每次都报这个错误无法建造。也不是网上说的ninja error&#xff0c;不是中文路径的问题。 在终端中查看&#xff0c;发现是缺少了git。&#xff08;我这里没有…

[ComfyUI]官方已支持Skyreels混元图生视频,速度更快,效果更好(附工作流)

一、介绍 昨天有提到官方已经支持了Skyreels&#xff0c;皆大欢喜&#xff0c;效果更好一些&#xff0c;还有GGUF量化版本&#xff0c;进一步降低了大家的显存消耗。 今天就来分享一下官方流怎么搭建&#xff0c;我体验下来感觉更稳了一些&#xff0c;生成速度也更快&#xf…