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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytest-html

首先安装pytest-html库 #执行命令 pytest --htmlreport.html ./pytest-html.pyimport pytest import logging def test_pass():"""用例通过"""assert Truedef test_fail():"""用例失败"""assert Falsedef test_e…

kafka为什么这么快?

前言 Kafka的高效有几个关键点,首先是顺序读写。磁盘的顺序访问速度其实很快,甚至比内存的随机访问还要快。Kafka在设计上利用了这一点,将消息顺序写入日志文件,这样减少了磁盘寻道的时间,提高了吞吐量。与传统数据库的…

从DeepSeek的爆火来看大模型微调技术的发展方向

“深度人工智能”是成都深度智谷科技旗下的人工智能教育机构订阅号,主要分享人工智能的基础知识、技术发展、学习经验等。此外,订阅号还为大家提供了人工智能的培训学习服务和人工智能证书的报考服务,欢迎大家前来咨询,实现自己的…

Dify使用教程(创建应用)

Dify的安装部署我已经写过了,简单的模型配置我也在前面进行了讲解,今天我们主要来讲讲如何使用Dify。 一、创建应用 我们可以通过三种方式在Dify的工作室内创建应用 01 基于应用模板创建(新手推荐)02 创建一个空白应用03 通过D…

system verilog的流操作符

流操作符&#xff0c;有分为操作对象是一整个数组和单独的数据两种&#xff0c;例如bit [7:0] a[4]和bit [31:0] b&#xff0c;前者操作对象是数组&#xff0c;后者是单独一个较大位宽的数。 流操作符有<<和>>&#xff0c;代表从右向左打包和从左向右打包。 打包的…

项目实战--网页五子棋(匹配模块)(4)

上期我们完成了游戏大厅的前端部分内容&#xff0c;今天我们实现后端部分内容 1. 维护在线用户 在用户登录成功后&#xff0c;我们可以维护好用户的websocket会话&#xff0c;把用户表示为在线状态&#xff0c;方便获取到用户的websocket会话 package org.ting.j20250110_g…

hot100_108. 将有序数组转换为二叉搜索树

hot100_108. 将有序数组转换为二叉搜索树 思路 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#…

Win11更新系统c盘爆满处理

1.打开磁盘管理 2.右击c盘选择属性&#xff0c;进行磁盘管理&#xff0c;选择详细信息。 3.选择以前安装的文件删除即可释放c盘空间。

深入理解 JSP 与 Servlet:原理、交互及实战应用

一、引言 在 Java Web 开发领域,JSP(JavaServer Pages)和 Servlet 是两个至关重要的技术,它们共同构成了动态网页开发的基础。Servlet 作为服务器端的 Java 程序,负责处理客户端请求并生成响应;而 JSP 则是一种简化的 Servlet 开发方式,允许开发者在 HTML 页面中嵌入 J…

[通俗易懂C++]:指针和const

之前的文章有说过,使用指针我们可以改变指针指向的内容(通过给指针赋一个新的地址)或者改变被保存地址的值(通过给解引用指针赋一个新值): int main() {int x { 5 }; // 创建一个整数变量 x&#xff0c;初始值为 5int* ptr { &x }; // 创建一个指针 ptr&#xff0c;指向 …

DL/CV领域常见指标术语(FLOPS/mIoU/混淆矩阵/F1-measure)------一篇入门

1. FLOPS、FLOPs和GFLOPs FLOPS: floating-point operations per second&#xff0c;每秒浮点运算次数&#xff0c;用来衡量硬件性能。 FLOPs&#xff1a;floating point of operations&#xff0c;是浮点运算次数&#xff0c;用来衡量算法、模型的复杂度。 GFLOPS&#xff…

被裁20240927 --- WSL-Ubuntu20.04安装cuda、cuDNN、tensorRT

cuda、cuDNN、tensorRT的使用场景 1. CUDA&#xff08;Compute Unified Device Architecture&#xff09; 作用&#xff1a; GPU 通用计算&#xff1a;CUDA 是 NVIDIA 的并行计算平台和编程模型&#xff0c;允许开发者直接利用 GPU 的并行计算能力&#xff0c;加速通用计算任…

DeepSeek vs ChatGPT:AI对决中的赢家是……人类吗?

DeepSeek vs ChatGPT&#xff1a;AI对决中的赢家是……人类吗&#xff1f; 文章目录 DeepSeek vs ChatGPT&#xff1a;AI对决中的赢家是……人类吗&#xff1f;一、引言1. 背景2. 问题 二、DeepSeek vs ChatGPT&#xff1a;谁更胜一筹&#xff1f;2.1 语言生成能力评测对比场景…

旧手机热点无法提供ipv6解决方法(emui 8 热点提供ipv6)

旧手机热点无法提供ipv6解决方法 手机&#xff1a;荣耀8x 系统版本: EMUI 8 网络&#xff1a;移动流量卡 解决方案 设置-》无线和网络-》移动网络-》接入点名称(APN)-》cmiot 修改 APN协议: IPv4/IPv6 修改 APN漫游协议: IPv4/IPv6

I2C学习笔记-软件模拟I2C

I2C学习笔记&#xff08;软件模拟&#xff09; 介绍GPIO的配置信号的展示起始信号 与 停止信号应答信号&#xff08;非应答信号&#xff09;检测应答信号发送一个字节数据接收一个字节数据 硬件配置实物测试 介绍 I2C的信号大概有 起始信号、应答信号、停止信号、写数据、读数…

VUE四:Vue-cli

什么是Vue-cli vue-cli是官方提供的一个脚手架,用于快速生成一个vue的项目模板; 预先定义好的目录结构及基础代码&#xff0c;就好比咱们在创建 Maven项目时可以选择创建一个骨架项目&#xff0c;这个骨架项目就是脚手架,我们的开发更加的快速; 什么是web pack 本质上&#…

基于 openEuler 构建 LVS-DR 群集

目录 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式&#xff0c;比较其各自的优势 NAT 模式&#xff08;网络地址转换模式&#xff09; DR 模式&#xff08;直接路由模式&#xff09; 基于 openEuler 构建 LVS-DR 群集 实验准备环境 配置web服务器 web1 web2 首先下载ngi…

传统的自动化行业的触摸屏和上位机,PLC是否会被取代?

传统的自动化行业的触摸屏和上位机是否会被取代&#xff1f; 在工业自动化领域&#xff0c;触摸屏和上位机长期扮演着核心角色&#xff0c;尤其在污水处理、化工生产等场景中&#xff0c;它们通过实时数据采集、逻辑控制、报警联动等功能&#xff0c;保障了生产设备的稳定运行…

Spring Boot 集成MyBatis-Plus

文章目录 一、背景说明二、集成过程 2.1 引入 maven 依赖2.2 增加属性配置2.3 自动配置类 三、验证集成 3.1 控制器3.2 服务类3.3 Mapper接口类3.4 实体类3.4 不要忘记XML文件3.5 发起请求 四、技巧拓展 4.1 如何打印sql语句&#xff1f;4.2 如何对参数增加非空验证&#xff1f…

力扣hot100——排序链表(常见方法,归并排序)

解题思路&#xff1a; 分解&#xff08;Divide&#xff09;&#xff1a;将待排序的列表递归地分成两半&#xff0c;直到每个子列表只包含一个元素&#xff08;此时每个子列表都是有序的&#xff09;。解决&#xff08;Conquer&#xff09;&#xff1a;递归地对每个子列表进行排…