0

序章

私は一日中過ごしましたが、電話ギャップアプリケーションで何が起こっているのか理解できません.

私のアプリでは、phonegap のローカル ストレージを使用して、Web ページから取得したニュース メッセージを保存しています。ユーザーがコンテンツをオフラインで視聴できるようにしたいので、これを行っています。

それらがオンラインの場合、アプリは最終更新日を Web サイトに送信するだけで、Web サイトは変更されたレコードのみを送信し、アプリはそれをローカル データベースに再度保存します。

初めてデータをロードするときを除いて、これはすべてかなりうまく機能します。

問題

初めてアプリを起動すると、Web サイトで利用可能なすべてのレコードをデータベースに入力する必要があります。(201 行) しかし、39 を超えるメッセージをロードしようとすると、未定義の SQL エラーが発生します。

ただし、php スクリプトを変更して、39 件の結果しか送信しないようにすることができます。アプリが初めてロードされた後、スクリプトを再度変更して、すべてのレコードを送信し、問題なく動作するようにします。

問題をさらに複雑にするために、アプリを起動するたびにすべてのテーブルが削除され、再作成されます (もちろん、これは開発目的のみであり、削除は最終バージョンには含まれません)。アプリを再起動すると、問題なく 201 レコードが読み込まれます。

問題を再現するには、アプリを完全にアンインストールしてから再インストールする必要があります。

コード

結果を保存するためのコード:

var q = 'INSERT OR REPLACE INTO NIEUWS (id, title, introtext, catid) VALUES (?, ?, ?, ?)';
var len = contents.length;
for (var i=0; i<len; i++){
    tx.executeSql(q, [contents[i].id, contents[i].title, contents[i].introtext, contents[i].catid]);
}

起動時のコード:

tx.executeSql('DROP TABLE IF EXISTS NIEUWS');
tx.executeSql('CREATE TABLE IF NOT EXISTS NIEUWS (id PRIMARY KEY, title TEXT, introtext TEXT, catid INTEGER)');

私は今完全に道に迷っているので、この問題があなたの何人かにとって理にかなっていることを本当に願っています.

前もって感謝します!

編集1 IDとタイトルのみを保存しようとしましたが、これは問題なく機能します。

var q = 'INSERT OR REPLACE INTO NIEUWS (id, title) VALUES (?, ?)';
var len = contents.length;
for (var i=0; i<len; i++){
    tx.executeSql(q, [contents[i].id, contents[i].title]);
}

編集 2 コールバックを待機するようにコードを書き直しましたが、同じエラーがまだ存在します。

function HandleNewsQuery(tx){
    var q = 'INSERT OR REPLACE INTO NIEUWS (id, title, introtext, catid) VALUES (?, ?, ?, ?)';
    if(c < contents.length){
        tx.executeSql(q, [contents[c].id, contents[c].title, contents[c].introtext, contents[c].catid], HandleNewsQuery, errorCB);
        c++;
     }
}
4

2 に答える 2

0

この問題を 3 日間調べた後、ようやく解決策を見つけました。私のデータベースは十分な大きさであると宣言されていません:

var db = window.openDatabase("test", "1.0", "Test DB", 200000);

サイズはバイト単位で宣言されているため、実際にはこのデータベースは 200KB しかありませんでした

これを次のように変更しました。

var db = window.openDatabase("test", "1.0", "Test DB", 20000000);

これは20MBです。

問題がデータの最初のロード時にのみ存在した理由はまだわかりません。

いろいろ考えてくれてありがとう!

于 2013-04-11T19:55:10.777 に答える
0

「for」でループするのではなく、前の SQL ステートメントのコールバックとして次の SQL ステートメントを作成する必要があると思います。

申し訳ありませんが、今は例を提供できません。

于 2013-04-09T13:37:12.607 に答える