2017-01-18 2 views
2

私はデータベースを使用するIonicアプリを持っています。私はこのデータベースにファイルの内容を書きたいと思っています。
私は働いています。 $ionicPlatform.ready()またはdocument.ready()とよく似たDB.ready()イベントを作成したいのですが、クエリを実行するまでデータベースが読み込まれるまで待つ必要があります。ionicPlatform.ready()やdocument.ready()のようなカスタムイベントを作成します。

私は、イオンとプロミスのコンセプトにかなり新しいので、簡単なものかもしれません。

私はAndroidで動作するようになっていますが、iOSは "someTablenameが存在しません"というクエリでエラーを返し続けます "私は複数のconsole.log()を配置しましたが、それらのすべてには問題ありません。

私が間違ったやり方を教えてもらえませんでしたか、それとももっと一般的な場合は別の方法でしょうか(また、私は新しいので、よく分からない)?
すべてのクエリに「query」が記録されると予想されましたが、これは重要ではありませんか?私のアプリを通じて

// L35_DB - Databaseclass for apps 
.factory('L35_DB', ['$ionicPlatform','$cordovaFile','$cordovaSQLite', function($ionicPlatform, $cordovaFile,$cordovaSQLite) { 
    var L35_DB = {db_start : false}; 
    //------------------------------------- 
    DB_READY = new Promise(function(resolve,reject){ 
     console.log("query"); 
     if(L35_DB.db_start){console.log("b"); resolve("Stuff worked!"); } 
     else{ 
      var filename='fileWithDB.db'; 
      $ionicPlatform.ready(function() { 
       if(window.cordova){ 
        return window.plugins.sqlDB.copy(filename, 0, 
         function(info){ loadDB(filename).then(function(){ console.log("First load", info); resolve("DB loaded?"); }) }, 
         function(info){ loadDB(filename).then(function(){ console.log("Other loads", info); resolve("DB loaded?"); }) } 
        ); 
       } 
      }); 
     } 
    }); 
    //------------------------------------- 
    // Load the file 
    function loadDB(filename){ 
     var loading = new Promise(function(resolve,reject){ 
      db = window.sqlitePlugin.openDatabase(
             {name: filename, location: 'default'}, 
             function(){ 
              console.log("loadDB success"); // <--- fired 
              L35_DB.db_start = true; // true, so next call we don't do all this 
              resolve("DB ready loading"); 
             }, 
             function(err){ reject(err);} 
            ); 
     }); 
     return loading; 
    } 
    //------------------------------------- 
    // Query - 
    var _query = function(query,values){ 
     if(!L35_DB.db_start){ 
      console.error("DB not init"); 
      return false; 
     } 
     else if(window.cordova){ 
      values = values || []; 
      var actualQuery = new Promise(function(resolve,reject){ 
       db.executeSql(query, values, resolve, reject); 
      }) 
      return actualQuery; 
     } 
    } 
    //------------------------------------- 
    return { 
     query : _query 
    }; 
}]) 

は私が行います

DB_READY.then(function() { 
    L35_DB.query("SELECT * FROM systems").then(function (result) { 
    // Something something something darkside 
    }) 
}) 

答えて

0

テストや掘削をたくさんした後、window.plugins.sqlDB.copy()が犯人だっ判明。

第2の値である位置を変更することができます。デフォルトは0ですが、iOSの場合は2にする必要があります。この変更後は、すべてが期待どおりに機能します。

この機能は、AndroidとiOS用のデータベースをあらかじめ読み込んでおく必要があります。

関連する問題