使用Ionic Native的Sqlite在Ionic 2应用程序中执行事务时出错

时间:2016-08-23 11:40:10

标签: sqlite cordova angular transactions ionic2

我有一个项目,其中我有一个用于设置和查询本地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 s​​qlite插件中sql transactions的以下文档以及Ionic native中的Sqlite插件文档。

在Ionic 2中使用Sqlite事务的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我认为您收到错误是因为如果this.sqlDb返回承诺参考您已打开的数据库,则无法访问thenopenDatabase您可以尝试使用以下内容{/ 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
        )`, [])
    });
}