2016-08-23 6 views
1

Ich habe ein Projekt, in dem ich einen Dienst zum Einrichten und Abfragen von lokalen SQLite-Datenbank haben. Ich verwende cordova-sqlite-plugin und Sqlite von Ionic Native.Fehler beim Ausführen von Transaktionen in Ionic 2 App mit Sqlite von Ionic Native

Dies ist der Code Ich muss die Datenbank öffnen und Tabellen erstellen, sobald die Datenbank geöffnet ist.

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); 
    }) 
} 
} 

Die Datenbank wird ordnungsgemäß geöffnet. Das Problem ist jedoch, dass die Transaktion zum Erstellen der Tabellen immer einen Fehler auslöst. In der Fangphase, wenn ich den Fehler protokolliere, ist es immer undefiniert.

Wenn ich eine einfache executeSQL Methode anstelle einer Transaktion ausführen, läuft es gut. Ich führe den Code derzeit auf einem Android 6.0-basierten Gerät aus.

Ich habe die folgende Dokumentation von sql transactions in Cordova sqlite Plugin und die Dokumentation von Sqlite Plugin in ionischen nativen gelesen.

Was ist der richtige Weg, um Sqlite-Transaktionen mit Ionic 2 zu verwenden?

Antwort

0

Ich glaube, Sie Fehler bekommen, weil Sie nicht in der Lage sind this.sqlDb innerhalb then zugreifen, die Sie mit unten, wenn openDatabase versuchen kann, ist Versprechen in Bezug auf Ihre geöffneten Datenbank Rückkehr:

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); 
}); 

Oder wenn openDatabase nicht zurückkehren versprechen, dann müssen Sie Transaktion erstellen, nachdem db Erstellung durch Prüfen, ob db geöffnet ist oder nicht mag:

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 
     )`, []) 
    }); 
} 
+0

this.sqlDb ist auf jeden Fall innerhalb der Verheißung verfügbar> dann Teil, wie ich bin mit Pfeil fu nktionen. Ich habe es sogar überprüft, indem ich es ausloggte. Es führt Methoden abgesehen von Transaktion ordnungsgemäß aus. Es wird nur Fehler ausgegeben, wenn ich die Transaktionsmethode aufruft. Dieses Verhalten ist nicht nur in der openDatabase-Zusage enthalten. Überall, wo ich es verwende, wird bei der Verwendung der Transaktion ein Fehler ausgegeben. Danke für die Hilfe. –

+0

dasselbe Verhalten habe ich in meinem Projekt. irgendwie funktionieren Transaktionen nicht wie sie sollen. –