2016-11-10 4 views
2

ハイブリッドアプリにIonic 2(Angular 2)を使用しています。私はSQLite3データベースからデータを表示し、次にデータをロードするためのページに共有プロバイダを挿入します。しかし、データベースプロバイダを作成するには、データベースを開くには少し時間がかかります(ごくわずかです)。しかし、私のコードは(この瞬間の時点で)クエリを実行する前にデータベースを開くのを待たず、エラーが発生します。Ionic2/Angular2が照会の前にSQLiteデータベースを開くのを待つ

クラッシュを回避するためにデータベースを開くのを待つコードをどのように構造化できますか?

私のデータベースプロバイダのコンストラクタ:このプロバイダーは私のページのコンストラクタに注入します

constructor(private platform: Platform) { 
this.platform.ready().then(() => { 
    if(this.isOpen !== true) { 
    this.storage = new SQLite(); 

    this.storage.openDatabase({name: "data.db", location: "default"}).then(() => { 
     this.isOpen = true; 
     this.storage.executeSql("CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY AUTOINCREMENT, firstname TEXT, lastname TEXT)", []); 
    }); 
    } 
}); 
console.log('Hello Database Provider'); 

ページ(ホームページ)がロードされると、load()関数を呼び出すイベントがトリガされます。

ionViewDidLoad() { 
this.load(); 
console.log('Hello Home Page'); 

ロード機能:私は非常に多く、誰かが正しい方向に私を指すことができます:)

+0

ここにすべてのニュースがありますか?私は同じ問題に直面しています。 – dermoritz

+0

@dermoritz私はこの問題を解決し、答えとして私の解決策を追加しました:) – enemypixel

答えて

2

を望んでいる

public load() { 
this.database.getPeople().then((result) => { 
    this.itemList = <Array<Object>> result; 
}, (error) => { 
    console.log("LOAD ERROR: ", error); 
}); 

は、私は私の問題への解決策をついに発見しました。

public openSQLiteDatabase() { 
return new Promise((resolve, reject) => { 
    if(this.isOpen) { 
    console.log("DB IS OPEN"); 
    resolve(this.isOpen); 
    } 

    else { 
    console.log("DB IS NOT OPEN"); 
    this.platform.ready().then(() => { 
     this.storage.openDatabase({name: "data.db", location: "default"}).then(() => { 
     this.appsettings.openSQLiteDatabase().then(() => { 
      this.appsettings.getSettings().then((result) => { 
      let settings: Settings = <Settings> result; 
      this.selectedDataset = settings.selectedDataset; 
      this.isOpen = true; 
      resolve(this.isOpen); 
      }); 
     }); 
     }, (error) => { 
     reject(error); 
     }); 
    }); 
    } 
});} 

この関数は約束(JS Promises)を返したよう:私はそれがない場合には、それはそれをロードするために進み、データベースがロードされているかどうかを確認する私のプロバイダに機能を追加しました手始めに

クエリを実行する前にデータベースを開くのを待つことができます。ページ固有のtypescriptファイル内

My機能:このようなコードで

ionViewDidLoad() { 
this.database.openSQLiteDatabase().then(() => { 
    this.loadDictionary(); 
});} 

私は私のデータベースが開かれている前に実行されたクエリとの問題を抱えていることはありません!

関連する問題