3

onDevicereadyがDBを作成し、テーブルに情報を入力するPhonegap(2.1.0)アプリケーションがあります。

Chromeでこれをローカルで(Rippleエミュレーターを使用して)実行すると機能します。必要に応じて、テーブルが作成され、データが入力されます。

Androidデバイスにビルド.apkをインストールした後、Eclipseログキャットに次のように表示されます。

    sqlite returned: error code = 14, msg = cannot open file at line 27712 of [8609a15dfa], db=/data/data/<project>/databases/webview.db

    sqlite returned: error code = 14, msg = os_unix.c: open() at line 27712 - "" errno=2 path=/CachedGeoposition.db, db=/data/data/<project>/databases/webview.db

ここのこの投稿によると、私はこれを信じています-無視することができます。

ただし、logcatでこのエラーに気づきました。

    sqlite returned: error code = 1, msg = no such table: latest_events, db=/data/data/<project>/databases/webview.db

また、adbシェルを介して、DBが作成されていないことを確認しました:ここ:/data/data/com.application/databases。またはここ:/data/data/com.application/app_databases

だから-私のコード:

 if (!window.openDatabase) {
        doMessage('Databases are not supported on this device. Sorry','error');
        return;
    }else{
        consoleLog('all good for storage');
        var db;
        var shortName = 'MyDB';
        var version = '1.0';
        var displayName = 'MyDB';
        var maxSize = 102400;

        function errorHandler(transaction, error) {consoleLog('Error: ' + error.message + ' code: ' + error.code);}

        function nullHandler(){};
        db = window.openDatabase(shortName, version, displayName,maxSize);


            consoleLog('starting table creation');
            db.transaction(function(tx){
                tx.executeSql( 'CREATE TABLE IF NOT EXISTS latest_events (id integer PRIMARY KEY AUTOINCREMENT,EventID integer,EventLocation text,EventName text,EventDateFrom varchar,EventTime timestamp,EventPresentedBy varchar,EventVenue varchar,EventScript text,RequireRSVP varchar)',[],nullHandler,errorHandler);
                db.transaction(function(tx){
                    tx.executeSql('SELECT count(id) as RowCount FROM device_info ', [],
                        function(tx, result) {
                            if (result != null && result.rows != null) {
                                for (var i = 0; i < result.rows.length; i++) {
                                    var row = result.rows.item(i);
                                    consoleLog('rowcount: '+row.RowCount);
                                    if(row.RowCount==0){
                                        tx.executeSql('INSERT INTO device_info (device_name, device_platform, device_uuid, device_os_ver, date_last_used) VALUES (?,?,?,?,?)',[device.name, device.platform, device.uuid, device.version, window.bowman_config.siteDate],nullHandler,errorHandler);
                                        //doMessage('device info row added','notice');
                                    }
                                }
                            }
                        },errorHandler);
                },errorHandler,successCallBack('2'));
                //doMessage('device info row added','notice');
            },errorHandler,successCallBack('1'));
}

私の悩みに追加するために-私のlogcatには、「すべてストレージに適しています」というconsole.log出力と、「テーブル作成の開始」メッセージが表示されます。

errorHandler関数は何も返さず、successCallBack関数がトリガーされます...しかしDBは作成されません。

助けてくれてありがとう。

4

3 に答える 3

0

ネストされた関数を単一の関数に分割し、成功または失敗に基づいてそれらを「チェーン」しました。実際、思ったよりずっと簡単でした。RTFMのようでした。すべての助けをありがとう。

簡略化:

var db = window.openDatabase("TheApp", "1.0", "The App", 50000000);
db.transaction(queryDB, errorCB, successCB);

// Query the database   //
function queryDB(tx) {
    //tx.executeSql('SELECT * FROM table", [], querySuccess, errorCB);
}

function querySuccess(tx, results) {
    //do more functions here
}

function errorCB(err) {
    console.log("Error processing SQL: "+err.code);
}
于 2013-02-10T15:36:40.050 に答える
0

今日、この問題に 3 時間かかりました。私が試したこと:

  • コピー データベース コードの書き換え。
  • エミュレーター/デバイスからのアプリの削除
  • エミュレーターのワイプ
  • 日食のクリーニング
  • ファイルのパーミッションの変更
  • 動作中の SQLite データベース ファイルを検証する

コードを共有 Dropbox アカウントから別の場所にコピーし、Android マニフェストと Java ファイルのコードを別のパッケージ名でリファクタリングすることで、問題を解決しました。

アプリケーションは今では問題なく動作します。つまり、コードに問題はありませんが、どこかで Dropbox によって複雑化されています。

于 2012-12-27T16:18:50.463 に答える
0

successCallBack("2") と successCallBack("1") を渡すと、実際にはそれらを直接呼び出しているため、success が実際に呼び出されたかどうかについて誤検知が発生する可能性があります。2 つの別々の成功コールバックを提供するか、たとえば console.log("1") を呼び出すいくつかの関数をインラインで提供する必要があります。

于 2012-11-13T19:18:44.020 に答える