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

相关推荐
RestCloud10 分钟前
在制造业数字化转型浪潮中,数据已成为核心生产要素。然而,系统割裂、数据滞后、开发运维成本高等问题,却像顽固的 “数据枷锁”,阻碍着企业发展。ETLCloud与
数据库·postgresql
!chen21 分钟前
【Spring Boot】自定义starter
java·数据库·spring boot
十碗饭吃不饱1 小时前
sql报错:java.sql.SQLSyntaxErrorException: Unknown column ‘as0‘ in ‘where clause‘
java·数据库·sql
我是Superman丶1 小时前
【优化】Mysql指定索引查询或忽略某个索引
数据库·mysql
程序定小飞2 小时前
基于springboot的在线商城系统设计与开发
java·数据库·vue.js·spring boot·后端
呆呆小金人2 小时前
SQL入门: HAVING用法全解析
大数据·数据库·数据仓库·sql·数据库开发·etl·etl工程师
LL_break2 小时前
Mysql数据库
java·数据库·mysql
野犬寒鸦2 小时前
从零起步学习Redis || 第十一章:主从切换时的哨兵机制如何实现及项目实战
java·服务器·数据库·redis·后端·缓存
BumBle2 小时前
uniapp 用css实现圆形进度条组件
前端·vue.js·uni-app
倔强的石头_3 小时前
面向大数据架构的演进:为何 Apache IoTDB 是与生态无缝融合的理想之选?
数据库