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.mzph.cn/pingmian/70878.shtml

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

相关文章

為什麼使用不限量動態住宅IP採集數據?

在瞭解“不限量動態住宅IP數據採集”之前,我們需要先搞清楚什麼是“動態住宅IP”。簡單來說,動態IP是一種會定期變化的IP地址,通常由互聯網服務提供商(ISP)分配給家庭用戶。與固定IP(靜態IP)不同…

多模态人物视频驱动技术回顾与业务应用

一种新的商品表现形态,内容几乎存在于手淘用户动线全流程,例如信息流种草内容、搜索消费决策内容、详情页种草内容等。通过低成本、高时效的AIGC内容生成能力,能够从供给端缓解内容生产成本高的问题,通过源源不断的低成本供给倒推…

navicat161_premium_cs_x64 安装与使用

navicat161_premium_cs_x64 安装与使用https://mp.weixin.qq.com/s/eE90x59hDVdk-shXSvICbA

自学c++之类、对象、封装

class 类名{int a;//属性 public://权限操作; } 1、权限 public(公共权限)类内可以访问,类外可以访问protected(保护权限)类内可以访问,类外不可以访问(儿子可以访问父亲中的保护内容&#xf…

mmdetection框架下使用yolov3训练Seaships数据集

之前复现的yolov3算法采用的是传统的coco数据集,这里我需要在新的数据集上跑,也就是船舶检测方向的SeaShips数据集,这里给出教程。 Seaships论文链接:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber8438999 一、…

基于 Python 的网络监控系统开发全解

基于 Python 的网络监控系统开发全解 本文详细阐述如何使用 Python 开发一个网络监控系统。通过介绍系统的功能需求,如网络设备状态监测、流量统计、故障告警等,展示利用 Python 丰富的库实现这些功能的过程,包括scapy进行网络数据包捕获、p…

【多模态处理篇三】【DeepSeek语音合成:TTS音色克隆技术揭秘】

最近帮某明星工作室做AI语音助手时遇到魔幻需求——要求用5秒的咳嗽声克隆出完整音色!传统TTS系统直接翻车,生成的语音像得了重感冒的电音怪物。直到祭出DeepSeek的TTS音色克隆黑科技,才让AI语音从"机器朗读"进化到"声临其境"。今天我们就来扒开这个声音…

基于YOLO11深度学习的苹果叶片病害检测识别系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

一篇docker从入门到精通

Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互之间不会有任何接口(类似 iP…

w803|联盛德|WM IoT SDK2.X测试|window11|TOML 文件|外设|TFT_LCD|测试任务|(5):TFT_LCD_LVGL示例

TFT_LCD_LVGL 功能概述 此应用程序是使用 WM IoT SDK 进行 LVGL 功能的示例。它演示了如何初始化 TFT LCD 设备,并创建 LVGL DEMO Task 进行 LVGL 模块的初始化,并展示 LVGL 原生的不同 Demo 场景, 例如: Widgets, Music Player, Benchmark…

openlayers结合turf geojson面获取面积和中心点

在 OpenLayers 中绘制 GeoJSON 面要素并计算面积和中心点,可以结合 OpenLayers 的 ol/format/GeoJSON 模块将 GeoJSON 数据转换为 OpenLayers 的 Feature,然后使用 Turf.js 进行计算。示例代码如下 import Map from ol/Map; import View from ol/View; …

nginx 搭建 IPv6 -> IPv4 反向代理服务器

背景 在实际生产过程中,由于各种原因,我们的在线服务搭建在火山云服务器上,使用火山云包括 ECS、CLB、PLB 等组件进行网络通信,并且通过专线接受来自某公司内部流量。但是在大概 22~23 年,某公司要把所有网络流量变为…

FTP出现“打开 FTP 服务器上的文件夹时发生错误。请检查是否有权限访问该文件夹。”如何处理?

关闭“使用被动FTP”功能:在控制面板的“Internet选项”中,点击“高级”标签卡,找到“使用被动FTP(为防火墙和DSL调制解调器兼容性)”,并取消勾选124。 检查FTP服务器设置:确保FTP服务器没有开…

wordpress使用CorePress主题设置项总结

宝塔面板设置 软件商店中安装的软件有:(宝塔网站加速3.1)(Nginx 1.18.0)(MySql 5.6.50)(PHP-5.6)(phpMyAdmin 4.4)(Python项目管理器 …

Oracle Redo日志损坏挽救详细攻略

一 介绍 1.1 介绍 Oracle Redo损坏分四种情况:unused状态日志损坏 inactive状态日志损坏 active状态日志损坏 current状态日志损坏。针对不同状态的日志损坏,处理方式有所不同,下面将逐一介绍。 二 恢复 2.1 unused与inactive状态日志损坏 如果这个…

003 SpringBoot集成Kafka操作

4.SpringBoot集成Kafka 文章目录 4.SpringBoot集成Kafka1.入门示例2.yml完整配置3.关键配置注释说明1. 生产者优化参数2. 消费者可靠性配置3. 监听器高级特性4. 安全认证配置 4.配置验证方法5.不同场景配置模板场景1:高吞吐日志收集场景2:金融级事务消息…

将VsCode变得顺手好用(1

目录 设置中文 配置调试功能 提效和增强相关插件 主题和图标相关插件 创建js文件 设置中文 打开【拓展】 输入【Chinese】 下载完成后重启Vs即可变为中文 配置调试功能 在随便一个位置新建一个文件夹,用于放置调试文件以及你未来写的代码,随便命名但…

1.1部署es:9200

安装es:root用户: 1.布署java环境 - 所有节点 wget https://d6.injdk.cn/oraclejdk/8/jdk-8u341-linux-x64.rpm yum localinstall jdk-8u341-linux-x64.rpm -y java -version 2.下载安装elasticsearch - 所有节点 wget ftp://10.3.148.254/Note/Elk/…

java后端开发day20--面向对象进阶(一)--static继承

(以下内容全部来自上述课程) 1.static–静态–共享 static表示静态,是java中的一个修饰符,可以修饰成员方法,成员变量。 1.静态变量 被static修饰的成员变量,叫做静态变量。 特点: 被该类…

DeepSeek本地部署+自主开发对话Web应用

文章目录 引言前端部分核心页面DeepSeek.vueMyModal.vue 后端部分WebSocketConfig 配置类AbstractDeepSeekToolDeepSeekWebSocketHandler 数据库设计总结 引言 最近DeepSeep横空出世,在全球内掀起一股热潮,到处都是满血大模型接入的应用,但这…