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
相关产品推荐
相关产品推荐

