当前位置: 首页 > article >正文

uniapp整合SQLite(Android)

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

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

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

 二、代码实现

<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


http://www.kler.cn/a/594943.html

相关文章:

  • 集成学习(下):Stacking集成方法
  • MANISKILL3:GPU 并行机器人模拟和渲染,用于通用的具身AI
  • 贪心算法(10)(java)跳跃游戏
  • hive的基础函数>>集合函数, 条件函数, 类型转换函数
  • GEO:在AI时代抢占DeepSeekC位?
  • 深度学习项目--基于ResNet和DenseNet混合架构网络论文的复现(pytorch实现)
  • 【大模型理论篇】CogVLM:多模态预训练语言模型
  • python3.13.2安装详细步骤(附安装包)
  • 【设计模式】C++ 单例模式总结与最佳实践
  • OO_Unit1
  • .net core集成MQTT服务端
  • 【c++】异常处理
  • 硬件与软件的边界-从单片机到linux的问答详解
  • 糊涂人寄信——递推
  • Unity动画片段丢失(AnimationClip),如何进行重新绑定
  • DApp+公链/主链+钱包+Swap开发西安区块链公司
  • 华为中小型企业项目案例
  • 理解Akamai EdgeGrid认证在REST API中的应用
  • 手机换IP有什么用?最新换IP方法
  • MySql 存储引擎 InnoDB 与 MyISAM 有什么区别