4

XMLを介してAjax呼び出しからニュースデータを取得する小さなPhonegapアプリケーションを作成しました。これは問題なく機能しますが、データをデータベーステーブルに保存して、ニュースをオフラインで読むこともできるようにしたいと思います。

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

問題は、ニュースをテーブルに格納するトランザクションで、次のメッセージが表示されたため、ニュースオブジェクトがもう存在しないように見えることです。

Uncaught TypeError:未定義のプロパティ'title'を読み取ることができません...

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

//  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

2 に答える 2

4

db.transactionは非同期です-executeSqlが実際に実行されるまでに、nはループの最後まですでにインクリメントされています。

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

于 2012-11-24T14:40:29.610 に答える
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;
        }
    }
}
于 2012-11-24T15:01:46.807 に答える