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

相关推荐
小羊没烦恼!27 分钟前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
Rain的Java大神之路31 分钟前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程
码途行者1 小时前
缓存一致性难题:Redis 和数据库如何做到数据一致?
数据库·redis
SelectDB1 小时前
Doris VARIANT 速查:类型映射、建表写法、索引配置与常见注意点
大数据·数据库·数据分析
l1t1 小时前
几种数据库软件count(distinct)和count()from group by子查询性能测试
开发语言·数据库
夜雪一千2 小时前
如何在MySQL中实现字段级加密
android·数据库·mysql
CJi0NG2 小时前
【自用】MySQL-存储引擎
数据库·mysql
weixin_460443562 小时前
在线考试人脸识别如何合规?本地活体检测、人脸模板加密与替代认证的技术架构设计
大数据·数据库·煤矿培训考试系统·煤矿在线考试系统·煤矿安全培训·煤矿考试系统
deepseek232 小时前
SQLite WAL 开了仍报 database is locked?Python 后台任务的事务与幂等修复
数据库·python·sqlite·并发编程·wal