uniapp整合SQLite(Android)

一. 在uni-app项目中, 链接SQLite

前端开发人员 应特殊需求, 需通过链接SQLite(关系型数据库) ,存储大量数据在Android/ios上

在项目中勾选此选项,确保相关权限

二、代码实现

html 复制代码
<template>
  <view class="content">
    <image class="logo" src="@/static/logo.png"></image>
    <view class="text-area">
      <text class="title">I fine</text>
    </view>
  </view>
</template>

<script>
export default {
  async onLoad() {
	  
    try {
      // 1. 打开数据库
      await this.openDB();
      
      // 2. 检查表是否存在(调试用)
      await this.debugShowTables();
      
      // 3. 建表
      await this.createTable();
      
      // 4. 显式事务插入数据
      await this.insertWithTransaction();
      
      // 5. 查询验证
      await this.selectSQL();
      
      // 6. 主动关闭数据库(重要!)
      await this.closeDB();
    } catch (error) {
      console.error('初始化失败:', error);
    }
  },
  methods: {
    // 打开数据库(强化错误处理)
    openDB() {
      return new Promise((resolve, reject) => {
        plus.sqlite.openDatabase({
          name: 'first',
          path: '_doc/hello.db',
          success: (e) => {
            console.log('✅ 数据库连接成功',e);
            resolve();
          },
          fail: (e) => {
            console.error('❌ 连接失败:', e);
            reject(`连接失败: ${JSON.stringify(e)}`);
          }
        });
      });
    },

    // 创建表(增加IF NOT EXISTS)
    async createTable() {
      try {
        await this.executeSql(
          `CREATE TABLE IF NOT EXISTS locations (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            address TEXT NOT NULL,
            area TEXT,
            age INTEGER DEFAULT 0
          )`
        );
        console.log('✅ 表创建成功');
      } catch (e) {
        throw new Error(`建表失败: ${e}`);
      }
    },

    // 使用显式事务插入
    async insertWithTransaction() {
      try {
        await this.executeSql('BEGIN TRANSACTION');
        
        await this.executeSql(
          `INSERT INTO locations (address, area, age) 
          VALUES ('北京', '安乐林', 11)`
        );
        
        await this.executeSql(
          `INSERT INTO locations (address, area, age) 
          VALUES ('上海', '浦东新区', 23)`
        );
        
        await this.executeSql('COMMIT');
        console.log('✅ 事务提交成功');
      } catch (e) {
        await this.executeSql('ROLLBACK');
        throw new Error(`事务失败: ${e}`);
      }
    },

    // 查询方法(增强调试)
    async selectSQL() {
      try {
        const data = await this.selectSql('SELECT * FROM locations');
        console.log('🔍 查询结果:', JSON.stringify(data, null, 2));
      } catch (e) {
        throw new Error(`查询失败: ${e}`);
      }
    },

    // 关闭数据库(新增方法)
    closeDB() {
      return new Promise((resolve) => {
        plus.sqlite.closeDatabase({
          name: 'first',
          success: () => {
            console.log('🗃️ 数据库已关闭');
            resolve();
          },
          fail: (e) => {
            console.warn('关闭数据库异常:', e);
            resolve(); // 即使失败也继续
          }
        });
      });
    },

    // 调试:显示所有表(新增方法)
    async debugShowTables() {
      try {
        const tables = await this.selectSql(
          "SELECT name FROM sqlite_master WHERE type='table'"
        );
        console.log('📑 当前数据库表:', tables);
      } catch (e) {
        console.warn('表查询失败:', e);
      }
    },

    // 通用SQL执行(保持原样)
    executeSql(sql) {
      return new Promise((resolve, reject) => {
        plus.sqlite.executeSql({
          name: 'first',
          sql: sql, // 强制刷新 Write-Ahead Logging
          success: () => {
			  console.log('强制刷新日志成功')
			  resolve()
		  },
          fail: (e) => {
			  console.error('刷新失败:', e)
			  reject()
		  }
        });
      });
    },

    // 通用查询(保持原样)
    selectSql(sql) {
      return new Promise((resolve, reject) => {
        plus.sqlite.selectSql({
          name: 'first',
          sql: sql,
          success: (data) => resolve(data),
          fail: (e) => reject(JSON.stringify(e))
        });
      });
    }
  }
}
</script>
<style>
  .content {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
  }

  .logo {
    height: 200rpx;
    width: 200rpx;
    margin-top: 200rpx;
    margin-left: auto;
    margin-right: auto;
    margin-bottom: 50rpx;
  }

  .text-area {
    display: flex;
    justify-content: center;
  }

  .title {
    font-size: 36rpx;
    color: #8f8f94;
  }
</style>

控制台输出 ,我们可以看到执行日志

最佳方案,是把代码封装到一个公共库,需要增删改查数据 直接调用指定方法即可 , 有其他好的建议欢迎指导, 交流前端相关技术

有需要可视化预览 Sqlite中的数据表, 可看下一章ADB工具实现

可视化预览Sqlite数据文章浏览阅读86次。adb(Android Debug Bridge)是Android开发中常用的一个工具,它允许开发者通过电脑与Android设备进行通信。如果你想通过adb导出手机上的文件,你可以按照以下步骤业务需求: 前端通过使用uni-app 的sqlite(关系型数据库系统) ,存储了大量的机密数据在手机上, 直接通过代码读取,体验感不够直观, 于是就产生了可视化预览数据的需求1. 开启USB调试确保你的Android设备已经开启了USB调试模式。你可以在"设置" -> "开发者选项"中开启它。https://blog.csdn.net/m0_71071209/article/details/146414320

相关推荐
TDengine (老段)2 小时前
TDengine 字符串函数 CHAR 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
qq7422349842 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
姚远Oracle ACE3 小时前
Oracle 如何计算 AWR 报告中的 Sessions 数量
数据库·oracle
Dxy12393102163 小时前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎3 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
杨云龙UP4 小时前
【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)
linux·运维·数据库·mysql·mssql
l1t4 小时前
利用DeepSeek辅助修改luadbi-duckdb读取DuckDB decimal数据类型
c语言·数据库·单元测试·lua·duckdb
安当加密4 小时前
Nacos配置安全治理:把数据库密码从YAML里请出去
数据库·安全
ColderYY4 小时前
Python连接MySQL数据库
数据库·python·mysql
GW_Cheng4 小时前
达梦数据库适配遇到的一些问题
数据库·国产化·达梦数据库