news 2026/4/3 4:05:46

UniApp 集成 SQLite 数据库完整教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UniApp 集成 SQLite 数据库完整教程

一、环境准备

1. 平台支持情况

  • ​App端(Android/iOS)​​: 完全支持SQLite数据库
  • ​H5端​​: 不支持,需使用WebSQL或IndexedDB替代
  • ​小程序端​​: 部分支持,需使用小程序自带的数据库API

2. 插件安装

推荐使用uni-sqlite插件,该插件对原生SQLite进行了封装,提供了统一的API接口:

​安装步骤​​:

  1. 打开HBuilderX,进入项目
  2. 点击菜单"工具"→"插件安装"
  3. 搜索"sqlite",安装"uni-sqlite"插件

二、数据库操作封装

1. 创建数据库工具文件

在项目根目录创建common/sqlite.js文件,封装常用数据库操作方法:

const dbName = "myDatabase"; // 数据库名称 const dbPath = "_doc/myDatabase.db"; // 存储路径 // 打开数据库 export function openDatabase() { return new Promise((resolve, reject) => { plus.sqlite.openDatabase({ name: dbName, path: dbPath, success: function(e) { console.log('数据库打开成功'); resolve(e); }, fail: function(e) { console.error('数据库打开失败:', JSON.stringify(e)); reject(e); } }); }); } // 检查数据库是否打开 export function isOpenDatabase() { return plus.sqlite.isOpenDatabase({ name: dbName, path: dbPath }); } // 执行SQL语句 export function executeSql(sql, args = []) { return new Promise((resolve, reject) => { plus.sqlite.executeSql({ name: dbName, sql: sql, args: args, success: function(e) { resolve(e); }, fail: function(e) { reject(e); } }); }); } // 查询数据 export function selectSql(sql, args = []) { return new Promise((resolve, reject) => { plus.sqlite.selectSql({ name: dbName, sql: sql, args: args, success: function(e) { resolve(e); }, fail: function(e) { reject(e); } }); }); } // 关闭数据库 export function closeDatabase() { return new Promise((resolve, reject) => { plus.sqlite.closeDatabase({ name: dbName, success: function(e) { resolve(e); }, fail: function(e) { reject(e); } }); }); }

三、数据库初始化

在应用启动时初始化数据库:

// 在App.vue的onLaunch中初始化 import { openDatabase, executeSql } from '@/common/sqlite.js'; export default { onLaunch() { this.initDatabase(); }, methods: { async initDatabase() { try { // 打开数据库 await openDatabase(); // 创建用户表 await executeSql(` CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT UNIQUE, age INTEGER, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) `); console.log('数据库初始化成功'); } catch (error) { console.error('数据库初始化失败:', error); } } } }

四、CRUD操作示例

1. 插入数据

async function insertUser(user) { try { const result = await executeSql( 'INSERT INTO users (name, email, age) VALUES (?, ?, ?)', [user.name, user.email, user.age] ); console.log('插入成功,ID:', result.insertId); return result.insertId; } catch (error) { console.error('插入失败:', error); throw error; } }

2. 查询数据

// 查询所有用户 async function getAllUsers() { try { const result = await selectSql('SELECT * FROM users'); return result; } catch (error) { console.error('查询失败:', error); throw error; } } // 条件查询 async function getUserById(id) { try { const result = await selectSql( 'SELECT * FROM users WHERE id = ?', [id] ); return result.length > 0 ? result[0] : null; } catch (error) { console.error('查询失败:', error); throw error; } }

3. 更新数据

async function updateUser(id, user) { try { const result = await executeSql( 'UPDATE users SET name = ?, email = ?, age = ? WHERE id = ?', [user.name, user.email, user.age, id] ); console.log('更新成功,影响行数:', result.rowsAffected); return result.rowsAffected; } catch (error) { console.error('更新失败:', error); throw error; } }

4. 删除数据

async function deleteUser(id) { try { const result = await executeSql( 'DELETE FROM users WHERE id = ?', [id] ); console.log('删除成功,影响行数:', result.rowsAffected); return result.rowsAffected; } catch (error) { console.error('删除失败:', error); throw error; } }

五、事务处理

async function transferMoney(fromId, toId, amount) { try { // 开始事务 await executeSql('BEGIN TRANSACTION'); // 扣款 await executeSql( 'UPDATE accounts SET balance = balance - ? WHERE id = ?', [amount, fromId] ); // 收款 await executeSql( 'UPDATE accounts SET balance = balance + ? WHERE id = ?', [amount, toId] ); // 提交事务 await executeSql('COMMIT'); console.log('转账成功'); } catch (error) { // 回滚事务 await executeSql('ROLLBACK'); console.error('转账失败:', error); throw error; } }

六、页面中使用示例

<template> <view> <button @click="addUser">添加用户</button> <button @click="getUsers">查询用户</button> <view v-for="user in userList" :key="user.id"> {{ user.name }} - {{ user.email }} </view> </view> </template> <script> import { insertUser, getAllUsers } from '@/common/sqlite.js'; export default { data() { return { userList: [] }; }, methods: { async addUser() { const user = { name: '张三', email: 'zhangsan@example.com', age: 25 }; try { await insertUser(user); uni.showToast({ title: '添加成功' }); } catch (error) { uni.showToast({ title: '添加失败', icon: 'none' }); } }, async getUsers() { try { this.userList = await getAllUsers(); } catch (error) { console.error('查询失败:', error); } } } }; </script>

七、注意事项

  1. ​平台兼容性​​: 确保只在App端使用SQLite,H5和小程序端需使用其他存储方案
  2. ​数据安全​​: 对输入数据进行验证和转义,防止SQL注入攻击
  3. ​性能优化​​: 批量操作时使用事务,避免频繁打开关闭数据库连接
  4. ​错误处理​​: 所有数据库操作都应添加try-catch块进行错误处理
  5. ​资源释放​​: 在应用退出或页面销毁时及时关闭数据库连接

通过以上步骤,你可以在UniApp项目中成功集成SQLite数据库,实现本地数据的持久化存储和高效操作。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 5:32:02

5个实战技巧突破抖音直播间数据采集瓶颈

5个实战技巧突破抖音直播间数据采集瓶颈 【免费下载链接】DouyinLiveWebFetcher 抖音直播间网页版的弹幕数据抓取&#xff08;2024最新版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveWebFetcher 当你尝试从抖音直播间获取用户互动数据时&…

作者头像 李华
网站建设 2026/4/1 22:13:20

组合逻辑电路设计入门必看:基础编码器构建步骤

从零开始构建一个4线-2线编码器&#xff1a;组合逻辑设计实战指南你有没有想过&#xff0c;键盘上每一个按键按下时&#xff0c;计算机是如何“知道”是哪一个键的&#xff1f;背后其实藏着一个简单却精妙的数字电路——编码器。它能把多个输入信号压缩成一组紧凑的二进制码&am…

作者头像 李华
网站建设 2026/4/1 15:34:15

止吠器项圈商业可行性分析报告

核心摘要&#xff1a; 随着“它经济”崛起与城市养犬管理趋严&#xff0c;止吠器项圈市场进入高速增长通道。 本报告基于小批量MVP验证视角&#xff0c;从市场规模、产品选型、成本定价、销售落地四大维度&#xff0c;论证高性价比振动型止吠器项圈的商业可行性。 核心结论&…

作者头像 李华
网站建设 2026/3/25 0:55:30

3个实用技巧帮你搞定抖音直播数据采集难题

3个实用技巧帮你搞定抖音直播数据采集难题 【免费下载链接】DouyinLiveWebFetcher 抖音直播间网页版的弹幕数据抓取&#xff08;2024最新版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveWebFetcher 你是不是也遇到过这样的情况&#xff1a;想…

作者头像 李华
网站建设 2026/3/28 12:08:36

电感饱和对电源性能的影响:新手教程

电感不“饱”不行&#xff1f;揭秘开关电源中那个被忽视的致命细节你有没有遇到过这样的情况&#xff1a;一个看似设计完美的Buck电路&#xff0c;在实验室轻载测试时输出稳定、效率达标&#xff0c;波形漂亮得像教科书插图。可一旦接上满载冷启动&#xff0c;系统突然反复重启…

作者头像 李华
网站建设 2026/3/22 16:58:20

Memcached是否是原子的?深入解析缓存系统的核心特性

文章目录Memcached是原子的吗&#xff1f;前言什么是原子操作&#xff1f;Memcached的基本操作Memcached不是原子的原因1. 没有锁机制2. 分布式系统的问题如何模拟原子操作&#xff1f;1. 使用CAS&#xff08;Compare And Swap&#xff09;示例代码2. 使用布隆过滤器示例代码总…

作者头像 李华