2013-10-24 19 views
12

私はSQLiteデータベースを使用するAndroid Cordova/Phonegapアプリケーションを開発しています。私は公式documentationの例を使用しました。AndroidとPhonegapを使用したSQLiteデータベースの格納

// Wait for device API libraries to load 
// 
document.addEventListener("deviceready", onDeviceReady, false); 

// Populate the database 
// 
function populateDB(tx) { 
    tx.executeSql('DROP TABLE IF EXISTS DEMO'); 
    tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)'); 
    tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")'); 
    tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")'); 
} 

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

// Query the success callback 
// 
function querySuccess(tx, results) { 
    var len = results.rows.length; 
    console.log("DEMO table: " + len + " rows found."); 
    for (var i=0; i<len; i++){ 
     console.log("Row = " + i + " ID = " + results.rows.item(i).id + " Data = " + results.rows.item(i).data); 
    } 
} 

// Transaction error callback 
// 
function errorCB(err) { 
    console.log("Error processing SQL: "+err.code); 
} 

// Transaction success callback 
// 
function successCB() { 
    var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000); 
    db.transaction(queryDB, errorCB); 
} 

// device APIs are available 
// 
function onDeviceReady() { 
    var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000); 
    db.transaction(populateDB, errorCB, successCB); 
} 

これは(データベースが作成され、満たされたエラーなし、と私は、クエリをバック書き込まれたデータを取得している)動作しているようですが、私は、データベースが私のデバイス上に保存されているかと思いまして。デバッグのために、私はAndroid 4.1.1でハードウェア電話を使用します。

データベースは/data/data/<myapppackage>/app_database/file__0/0000000000000001.dbの下にあります。今私はデータベースをエクスポートし、SQLiteManagerを使って自分のPCで手動で分析したかったのですが、変更がdbファイルに書き込まれていないようです。ディレクトリ/data/data/<myapppackage>/app_database/file__0/を調べるとき

はしかし、私は、そのタイムスタンプ、私がデータベース操作を実行するたびに変更されている2つの一時ファイル 0000000000000001.db-shm0000000000000001.db-walを見つけましたが、決してDBファイルそのもの。

私の質問は、変更が永続データベースファイルに書き込まれないのはなぜですか? phonegapとのデータベース接続を閉じる方法はないようで、アプリケーションを手動で終了させて​​も変更は.dbファイルに書き込まれません。私は何が間違っていたのか分かりません。

誰でもこの問題を確認できますか?

答えて

0

解決策は次のとおりです。物理デバイスではなくエミュレータでアプリケーションをデバッグします。

物理デバイスではなくemulatorでアプリを実行します。 databaseファイルは/data/data/YOUR_PACKAGE_NAME/app_database/にあります。ファイルpulldatabaseを使用して、テーブルとデータを参照できます。

+0

にSQLiteのプラグインをインストールします。これは、ソリューションではありません上記のディレクトリにあります。しかし、私はこの問題を解決したと考えています。なぜなら、私がもう記述した振る舞いを再現できないからです。 Androidがデータベースを閉じるのを妨げる何かがあったようだが、私はそれが何であったのかわからない。 – qefzec

+0

アプリケーションの実行中にデータベースをphonegapするためにアンドロイドデータベースを使用する必要があります。 – AndyBoy

0

WAL modeには、変更が-walファイルに書き込まれます。 checkpointが完了するまでデータベースファイル自体は更新されません。

-walファイルがある場合は、それもコピーする必要があります。

11
tx.executeSql('DROP TABLE IF EXISTS DEMO'); 

上記のこのラインは、DEMO毎回、あなたのPhoneGapのモバイルアプリケーション

を開始という名前のテーブルを削除し、私はちょうど私があなたのコードを愛するあなたに伝えたかったです。それは誰のPhoneGapやCordovaアプリケーションのために "何をすべきか"についての非常に良い手がかりを与えます。 SQLiteの世界にはじめて参入する人に大いに役立ちます。

あなたのコードは、Cordova/PhoneGap SQLiteプラグインの公式サイトGitHubに書かれているコードと比較して、読みやすく理解しています。

私の友人は、会社のCTOも務めていて、SQLiteの経験が豊富で、SQLiteデータベース接続を手動で閉じる必要はなく、SQLiteも非常にお勧めします。

とのPhoneGap/Cordovaの情報のためのSQLiteを探している誰のため -

あなたはMYTABLEという名前のテーブルを持っているし、値を格納したいとしましょう「美しい」と「イルカ」

タブレットや携帯電話などのモバイルデバイスのSQLiteで操作を実行する場合は、このように呼び出すことを忘れないでください。

ソースコードには次のように入力してください

function insertNewLine(tx) 
{ 
    tx.executeSql("INSERT INTO mytable (word, meaning) VALUES (?,?)", [ var1 , var2 ]); 
} 

とvar1の店内「美しい」と「イルカ」var2の内側と

は、SQLのINSERT文を実行して、デバイス内部で保存するには、次のステートメントを実行します。

db.transaction(insertNewLine); 

は直接

が直接tx.executeSql(*// * SQLのINSERT文)を呼び出さないでください insertNewLine(TX)を呼び出さないください。あなたのJavaScriptのソースコードで

には、SQLクエリ文に直接値を含めないで、データベースに保存する値を含むSQL文を実行しないでください。次言い換えれば

は、上記 間違った

tx.executeSql('INSERT INTO mytable (word, meaning) values (beautiful, dolphin)'); 

で保存したい値は、「美しい」と「イルカ」は、SQL文の内部に含まれているため正しくありません。それらは別々にする必要があります。

は、以下の

tx.executeSql("INSERT INTO mytable (word, meaning) VALUES (?,?)", [ var1 , var2 ]); 
// Notice that the values you want to store, beautiful and dolphin 
// are separate from the SQL INSERT INTO statement 

をINSERT SQLを実行し、JavaScriptコード

db.transaction(insertNewLine); 

ない以下のコードに次のように含むことにより、データベース全体のトランザクションを実行するための正しい方法です

tx.executeSql("INSERT....."); // this will not save your values onto the device 

ない下記のコードのいずれか

insertNewLine(tx); // this will not save your values onto the device either. 

そして、SELECT SQL文を使用するには、

// Get all lines in the table 
// 
function viewthelastglory(tx) 
{ 
    tx.executeSql('SELECT * FROM CUSTOMTABLE', [], querySuccess, errorcode); 
} 

// Deal with the lines 
// 
function querySuccess(tx, results) 
{ 
    var len = results.rows.length; var queryresult = "all entries "; 

    for (var i = 0 ; i < len ; i++) 
    { 
     queryresult = queryresult + 

     " Row - " + i + 
     " Word - " + results.rows.item(i).word + 
     " Meaning - " + results.rows.item(i).meaning; 
    } 

// and now, you can use the queryresult variable to use the values 
} 

function errorcode(errorhaha) 
{ 
    alert("Error Code " + errorhaha.code + " Error Message " + errorhaha.message); 
} 

し、次のコードを持っている、あなたがしている場合は、データベースのトランザクション

db.transaction(viewthelastglory); 

を行いますSQLite、WebSQL、IndexedDBの中から1つを選択しようとすると、しばらくの間、stackoverflowの周りを検索したことを覚えておいてください。

  • 誰も
  • 、その複雑さのためのIndexedDBを好きではないのIndexedDBはWebSQLは673Kの結果を返しますが、SQLiteのは、1800Kの結果を返しますWebSQL W3C
  • によって廃止されましたモバイルOSの多くの種類とバージョン
  • と互換性がありません。 IndexedDBはGoogleで300Kの結果を返します
  • IndexedDB、SQLite、WebSQLの中で、SQLiteは公式サイトを持つ唯一のデータベースです。

、コマンドラインで次のコマンドのPhoneGapはWebSQLデータベースを使用するので、あなたのコルドバプロジェクトのディレクトリにいる間、あなたのコルドバプロジェクト

cordova plugin add https://github.com/brodysoft/Cordova-SQLitePlugin 
関連する問題