uni-app集成sqlite

news/2025/2/24 9:52:34
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.niftyadmin.cn/n/5864195.html

相关文章

goredis常见基础命令

基本操作 //删除键 exists,err: rdb.Exists(ctx,"key").Result() if err!nil{panic(err) } if exists>0{err rdb.Del(ctx,"key").Err()if err!nil{panic(err)} }string类型 //设置一个键值对 //0表示没有过期时间 err:rdb.Set(ctx,"key1",…

Layer2 扩容解决方案详解

Layer2 扩容解决方案详解 🔄 1. Layer2 基础概念 1.1 什么是 Layer2? Layer2 是建立在以太坊主网(Layer1)之上的扩容解决方案,它: 继承以太坊的安全性提供更高的交易吞吐量降低交易费用保持去中心化特性…

hot100_300. 最长递增子序列

hot100_300. 最长递增子序列 思路动态规划 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 […

细说STM32F407单片机2个ADC使用DMA同步采集各自的1个输入通道的方法

目录 一、示例说明 二、工程配置 1、RCC、DEBUG、CodeGenerator 2、USART6 3、TIM3 (1)Mode (2)参数设置 (3) TRGO (4)ADC1_IN0 1)ADCs_Common_Settings 2&a…

nextjs项目搭建——头部导航

Header.tsx 在src/app/component路径下,创建Header.tsx use client;import Link from next/link; import { usePathname } from next/navigation; import Logo from ./Logo;const Header () > {const pathname usePathname();const navItems [{ label: 首页…

本地部署Qwen2.5-VL-7B-Instruct多模态视觉大模型(Windows篇)

本文已首发于 秋码记录 如果你也想搭建一个与秋码记录一样的网站,可以浏览我的这篇 国内 gitee.com Pages 下线了,致使众多站长纷纷改用 github、gitlab Pages 托管平台 秋码记录网站使用的主题是开源的,目前只在github.com开源。 hugo-the…

Windows PyCharm的python项目移动存储位置后需要做的变更

项目使用的venv虚拟环境,因此项目移动存储位置后需要重新配置python解释器的位置,否则无法识别,若非虚拟环境中运行,则直接移动后打开即可,无需任何配置。 PyCharm版本为2021.3.3 (Professional Edition),其…

选择排序和计数排序

选择排序和计数排序 选择排序 定义 选择排序是一种简单直观的排序算法。它的基本思想是在每一趟遍历中找到未排序部分中的最小元素,并将其放到正确的位置上。 操作步骤 初始化:设数组长度为 n。外层循环:控制需要选择的位置 i,从 …