我有一个项目,其中我有一个用于设置和查询本地sqlite数据库的服务。我使用了来自Ionic Native的cordova-sqlite-plugin和Sqlite。
这是我打开数据库并在打开数据库后创建表的代码。
import {Injectable} from '@angular/core';
import {SQLite} from "ionic-native";
@Injectable()
export class LocalDbService {
sqlDb: SQLite;
constructor() {
this.sqlDb = new SQLite();
}
openDatabase() {
return this.sqlDb.openDatabase({
name: 'app.db',
location: 'default'
}).then(() => {
return this.sqlDb.transaction((tx) => {
tx.executeSql(`create table if not exists groups (
id nvarchar(50) primary key not null,
name nvarchar(50) unique not null,
createdOn datetime not null default current_timestamp,
updatedOn datetime not null default current_timestamp,
deleted boolean not null default 0
)`, [])
})
}).catch((err) => {
console.error('Error while creating tables', err);
})
}
}
数据库正确打开。但是,问题是创建表的事务总是抛出错误。在记录错误的catch阶段,它始终是未定义的。
如果我执行一个简单的executeSql方法而不是一个事务,它运行正常。我目前正在基于Android 6.0的设备上运行代码。
我已经阅读了Cordova sqlite插件中sql transactions的以下文档以及Ionic native中的Sqlite插件文档。
在Ionic 2中使用Sqlite事务的正确方法是什么?
答案 0 :(得分:0)
我认为您收到错误是因为如果this.sqlDb
返回承诺参考您已打开的数据库,则无法访问then
内openDatabase
您可以尝试使用以下内容{/ 1}}:
this.sqlDb.openDatabase({
name: 'app.db',
location: 'default'
}).then((db) => {
return db.transaction((tx) => {
tx.executeSql(`create table if not exists groups (
id nvarchar(50) primary key not null,
name nvarchar(50) unique not null,
createdOn datetime not null default current_timestamp,
updatedOn datetime not null default current_timestamp,
deleted boolean not null default 0
)`, [])
})
}).catch((err) => {
console.error('Error while creating tables', err);
});
或者如果openDatabase
没有返回promise,则必须通过检查db是否打开来创建db后创建事务:
this.sqlDb.openDatabase({
name: 'app.db',
location: 'default'
});
if(this.sqlDb) {
this.sqlDb.transaction((tx) => {
tx.executeSql(`create table if not exists groups (
id nvarchar(50) primary key not null,
name nvarchar(50) unique not null,
createdOn datetime not null default current_timestamp,
updatedOn datetime not null default current_timestamp,
deleted boolean not null default 0
)`, [])
});
}