私は最終的に私が信じている私の問題の周りに私の頭を包むことができなかった。IonicとSQLite - 約束でinitロードを構築する
私はcordova sqlite plugin
で実行しているSQLiteデータベースからユーザーデータを初期化する必要があります。私の問題は、DBを読むことが非同期の遅延可能なthis.loadData
機能(下記)にあることです。 (私は "昔ながらの"かもしれませんが、私の主な苦情はここにあります。なぜDBアクセスは他のすべてのデータベースと同様に同期機能にありませんか? $stateChangeSuccess
に反応し、leaflet.js
マップを表示します。これは、すぐに状態コントローラ内の$urlRouterProvider.otherwise('/app/map');
によって開始されます。
私の問題は、すべてのデータがロードされるまでView Controllerの読み込みを停止する方法がわかりません。私は$ionicPlatform.ready
にSQLiteのデータをロードしようとしましたが、負荷がすぐにトリガされるようにしましたが、ビューをロードしているデバイスではバックグラウンドSQLiteスレッドを追い越していました。
モジュールのインスタンス化中にモジュール内のデータをロードしようとすると、最後にthis.loadData()
が呼び出されました。しかし、コードワモジュールはそれまで初期化されておらず、失敗します。
どのような方法が最適ですか?すべてがロードされたときに起動するカスタムイベントを作成できますか?すべての進捗状況を待つスプラッシュ画面の後に中間ビューを追加する必要がありますか?
本質的に、私のデータが読み込まれるまでアプリケーションの読み込み手順をすべて完了させなければならず、SQLiteがすべてのデータアクセスを約束するように強制する際に、この処理方法を知らない。私は本当に同期/非同期DBアクセスの選択を何とかしたいと思っています。あなたが約束を返したよう
//this is in a module dataService
this.loadData = function(){
if(!myDB)
myDB = $cordovaSQLite.openDB('my.db');
var deferred = $q.defer();
myDB.transaction(function(transaction1) {
transaction1.executeSql('SELECT ID,Data FROM myDB;', [],
function(tx, result) {
console.log(result.rows.length);
var dataJSON = result.rows.item(0).Data;
var dataParsed = JSON.parse(dataJSON);
deferred.resolve(dataParsed);
},
function(error) {
console.log("SELECT failed. Must create table first");
//do other stuff ...
});
});
return deferred.promise;
}
// in my MapViewController the app reacts to
$scope.$on("$stateChangeSuccess", function() {
// init views with the data that should be available now
}
//this is in the starter module
angular.module('starter',[]).config(function($stateProvider, $urlRouterProvider){
\\... states ...
$urlRouterProvider.otherwise('/app/map');
}