You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ionic Angular项目中SQLite多表创建失败,求可行实现方案

Ionic中SQLite多表创建的正确实现

你的代码存在两个核心问题:

  • 重复调用platform.ready()监听平台就绪事件,完全没必要,平台就绪只需要监听一次
  • 重复创建同一个数据库的连接,可能引发资源冲突或不必要的性能开销

下面是修正后的三种实现方式:

方式一:链式调用执行多表创建

databaseConn() {
  this.platform.ready().then(() => {
    this.sqlite.create({
      name: this.db_name,
      location: 'default'
    }).then((sqLite: SQLiteObject) => {
      this.dbInstance = sqLite;
      // 先创建product表,成功后再创建customer表
      sqLite.executeSql(`
        CREATE TABLE IF NOT EXISTS ${this.db_table} (
          product_id INTEGER PRIMARY KEY,
          product_name varchar(255),
          product_price varchar(255)
        )`, [])
      .then(() => {
        return sqLite.executeSql(`
          CREATE TABLE IF NOT EXISTS ${this.db_table2} (
            customer_id INTEGER PRIMARY KEY,
            customer_name varchar(255)
          )`, []);
      })
      .then((res) => {
        console.log('多表创建成功');
      })
      .catch((error) => {
        console.error('表创建失败:', error);
        alert(JSON.stringify(error));
      });
    })
    .catch((error) => {
      console.error('数据库连接失败:', error);
      alert(JSON.stringify(error));
    });
  });
}

方式二:使用事务批量创建(推荐)

事务可以保证所有表创建操作的原子性——要么全部成功,要么全部回滚,适合多表初始化场景:

databaseConn() {
  this.platform.ready().then(() => {
    this.sqlite.create({
      name: this.db_name,
      location: 'default'
    }).then((sqLite: SQLiteObject) => {
      this.dbInstance = sqLite;
      // 开启事务
      sqLite.transaction((tx) => {
        // 执行第一个表创建
        tx.executeSql(`
          CREATE TABLE IF NOT EXISTS ${this.db_table} (
            product_id INTEGER PRIMARY KEY,
            product_name varchar(255),
            product_price varchar(255)
          )`, []);
        // 执行第二个表创建
        tx.executeSql(`
          CREATE TABLE IF NOT EXISTS ${this.db_table2} (
            customer_id INTEGER PRIMARY KEY,
            customer_name varchar(255)
          )`, []);
      })
      .then(() => {
        console.log('多表创建成功(事务执行完成)');
      })
      .catch((error) => {
        console.error('事务执行失败:', error);
        alert(JSON.stringify(error));
      });
    })
    .catch((error) => {
      console.error('数据库连接失败:', error);
      alert(JSON.stringify(error));
    });
  });
}

方式三:用async/await简化代码(更易读)

如果你的项目支持ES7+语法,可以用async/await让代码更简洁:

async databaseConn() {
  try {
    await this.platform.ready();
    const sqLite = await this.sqlite.create({
      name: this.db_name,
      location: 'default'
    });
    this.dbInstance = sqLite;
    
    // 执行多表创建
    await sqLite.executeSql(`
      CREATE TABLE IF NOT EXISTS ${this.db_table} (
        product_id INTEGER PRIMARY KEY,
        product_name varchar(255),
        product_price varchar(255)
      )`, []);
    
    await sqLite.executeSql(`
      CREATE TABLE IF NOT EXISTS ${this.db_table2} (
        customer_id INTEGER PRIMARY KEY,
        customer_name varchar(255)
      )`, []);
    
    console.log('多表创建成功');
  } catch (error) {
    console.error('操作失败:', error);
    alert(JSON.stringify(error));
  }
}

关键注意点

  • 确保db_name、db_table、db_table2已在组件中正确定义(比如private db_name = 'myApp.db'; private db_table = 'products'; private db_table2 = 'customers';)
  • CREATE TABLE IF NOT EXISTS语句可以避免重复创建表时抛出错误
  • 统一的错误处理可以帮你快速定位问题,建议用console.error替代仅弹窗,方便调试

内容的提问来源于stack exchange,提问作者Joojoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 12:54:23