2012-11-24 14 views
5

私は、XML経由でAjax呼び出しからニュースデータを取得する小さなPhonegapアプリケーションを作成しました。これは正常に動作しますが、データベーステーブルにデータを保存して、オフラインでニュースを読むこともできます。ループを使用してsqliteデータベースに行を追加する(Phonegap)

Ajaxコールバックがデータをループするときに、グローバルニュースオブジェクトを埋め込み、データがデータベースに既に格納されているかどうかを確認する関数を呼び出します。そうでない場合は、データベースのニューステーブルに挿入する必要があります。

問題は私のニュースオブジェクトはもう存在しないように私がメッセージを取得するためのテーブルでニュースを格納するためのトランザクションで、それが思われることである:

Uncaught TypeError: Cannot read property 'title' of undefined in ...

それでは、どのように私はそれを確認することができますこの作品?ここで私はニュースを選択して、それが既に存在だかどうかを確認したい部分のコードは次のとおりです。

// Check if a news from the internet already exists in the database; If not, insert it 
function checkNewsInDB(){ 
    db.transaction(function(tx){ 
     tx.executeSql("SELECT * FROM NEWS", [], checkSuccess, dbErrorCB); 
    }, dbErrorCB, dbSuccessCB); 
} 

// Result Callback from the News Check 
function checkSuccess(ctx, result){ 
    var len = result.rows.length; 
    var found = false; 
    for(var n = 0; n < newsContainer.length; n++){ 
     for(var r = 0; r < len; r++){ 
      if(result.rows.item(r).n_title == newsContainer[n].title 
       && result.rows.item(r).n_pubdate == newsContainer[n].pubdate){ 
       found = r; 
      } 
     } 
     if(found == false){ 
      db.transaction(function(tx){ 
       tx.executeSql("INSERT INTO NEWS (n_title, n_link, n_creator, n_pubdate, n_description) VALUES (?,?,?,?,?)", [newsContainer[n].title, newsContainer[n].link, newsContainer[n].creator, newsContainer[n].pubdate, newsContainer[n].description], insertSuccess, dbErrorCB); 
      }, dbErrorCB, dbSuccessCB); 
     } else { 
      found = false; 
     } 
    } 
} 

newsContainerが、私はそれをチェックして、データの数行で満たされています。誰かがなぜこれがうまくいかないのか理解できるように助けてくれたら、とても嬉しいです。

ありがとうございます!

挨拶、

ベルント

答えて

4

db.transactionは非同期である - は、ExecuteSQLが実際に実行時間により、N既にループの終わりにインクリメントされています。

各アイテムに対して新しいトランザクションを作成するのではなく、トランザクション機能内でループを移動してみてください。

+0

あなたはサンプルコードを送信してください。私はまだそれを理解することはできませんか? –

2

お返事ありがとうございます。

// Check if a news from the internet already exists in the database; If not, insert it 
function checkNewsInDB(){ 
    db.transaction(function(tx){ 
     tx.executeSql("SELECT * FROM NEWS", [], checkSuccess, dbErrorCB); 
    }, dbErrorCB, dbSuccessCB); 
} 

// Result Callback from the News Check 
function checkSuccess(ctx, result){ 
    var len = result.rows.length; 
    var found = false; 
    for(var n = 0; n < newsContainer.length; n++){ 
     for(var r = 0; r < len; r++){ 
      if(result.rows.item(r).n_title == newsContainer[n].title 
       && result.rows.item(r).n_pubdate == newsContainer[n].pubdate){ 
       found = r; 
      } 
     } 
     if(found == false){ 
      var title = newsContainer[n].title; 
      var link = newsContainer[n].link; 
      var creator = newsContainer[n].creator; 
      var pubdate = newsContainer[n].pubdate; 
      var description = newsContainer[n].description; 
      ctx.executeSql("INSERT INTO NEWS (n_title, n_link, n_creator, n_pubdate, n_description) VALUES (?,?,?,?,?)", 
         [title, link, creator, pubdate, description], insertSuccess, dbErrorCB); 
     } else { 
      found = false; 
     } 
    } 
} 
関連する問題