2016-08-23 16 views
1

У меня есть проект, в котором у меня есть служба для настройки и запроса локальной базы данных sqlite. Я использую cordova-sqlite-plugin и Sqlite от Ionic Native.Ошибка при выполнении транзакций в приложении Ionic 2 с использованием Sqlite от Ionic Native

Это код, который я должен открыть в базе данных и создать таблицы после открытия базы данных.

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.

Я прочитал следующую документацию sql transactions в плагине Cordova sqlite и документацию плагина Sqlite в Ionic native.

Каков правильный способ использования транзакций Sqlite с Ionic 2?

ответ

0

Я думаю, вы получаете сообщение об ошибке, потому что вы не можете получить доступ к this.sqlDb внутри then вы можете попробовать ниже, если openDatabase возвращается обещание со ссылкой на ваш открытой базе данных:

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 не возвращающей обещаю, то вы должны создать транзакцию после создания БД, проверяя, если БД открыта или не нравится:

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, безусловно, доступны внутри promise-> то часть, как я использую стрелки фу nctions. Я даже проверил его, выписав его. Он отлично выполняет методы, отличные от транзакции. Это вызывает только ошибку при вызове метода транзакции. Это поведение не только внутри обещания openDatabase. В любом месте, где я использую его, он вызывает ошибку при использовании транзакции. Спасибо за помощь. –

+0

такое же поведение у меня есть в моем проекте. как-то транзакции не работают, как им следует. –

Смежные вопросы