2013-10-24 30 views
12

我正在開發一個Android Cordova/Phonegap應用程序,我想使用SQLite數據庫。我使用官方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在我的電腦上手動分析數據庫,但似乎這些更改沒有寫入數據庫文件。

然而,檢查目錄/data/data/<myapppackage>/app_database/file__0/當我發現這兩個臨時文件0000000000000001.db-shm0000000000000001.db-wal,其時間戳改變我每次執行數據庫操作的時間,但從來沒有在數據庫文件本身。

我的問題是,爲什麼變化永遠不會寫入永久數據庫文件?似乎沒有辦法通過phonegap關閉數據庫連接,甚至手動關閉應用程序也不會將更改寫入.db文件。我不確定我做錯了什麼。

有人在這裏看到問題嗎?

回答

0

解決方案是:使用模擬器而不是物理設備調試您的應用程序。

emulator而不是物理設備運行您的應用程序。您會在/data/data/YOUR_PACKAGE_NAME/app_database/中找到您的database文件。您可以pulldatabase文件並瀏覽表格和數據。

+0

這是解決不了問題的,因爲PhoneGap的使用的WebSQL數據庫位於我上面寫的目錄。但是,我認爲這個問題已經解決,因爲我無法再現我所描述的行爲。看來有些東西阻止了Android關閉數據庫,我不知道它是什麼。 – qefzec

+0

我需要在運行應用程序時使用android數據庫到phonegap數據庫。 – AndyBoy

0

WAL mode中,將任何更改寫入-wal文件;數據庫文件本身不會更新,直到完成checkpoint

如果還有-wal文件,則必須將其複製。

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

上面這條線將刪除名爲DEMO每次啓動您的PhoneGap移動應用

表,我只是想告訴你我愛你的代碼。它爲任何人的PhoneGap或Cordova應用程序提供了關於「該做什麼」的非常好的線索。它將大大幫助任何第一次進入SQLite世界的人。

與GitHub上的Cordova/PhoneGap SQLite插件官方網站上編寫的代碼相比,您的代碼非常乾淨可閱讀和理解。我的朋友同時也是一家公司的首席技術官,並且有很多SQLite的經驗,他告訴我沒有必要手動關閉SQLite數據庫連接,也非常推薦SQLite。

以及其它任何人找SQLite,讓的PhoneGap /科爾多瓦信息 -

假設你有一個表名爲MyTable,並希望存儲值「美麗」和「海豚」

當您想對移動設備(如平板電腦或手機)的SQLite執行操作,請記住以這種方式調用它

在源代碼中有以下內容

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

和存儲「美麗」裏面VAR1和「海豚」內VAR2和

做下面的語句,以執行SQL INSERT語句,然後保存在設備內部。

db.transaction(insertNewLine); 

不要直接調用insertNewLine(TX)

不要直接調用tx.executeSql(/ * SQL INSERT語句* /);在您的JavaScript源代碼中

並且不要直接將值包括到SQL查詢語句中,然後運行包含要存儲在數據庫中的值的SQL語句。

換句話說,以下是不正確

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

以上不正確,因爲要存儲的值,「美麗」和「海豚」被包括在SQL語句中。他們應該分開。

以下是運行INSERT 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 

,然後通過在你的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中選擇一個,請記住,我搜索了一段時間的計算器,並瞭解到

  • 沒有人喜歡,因爲它的複雜性IndexedDB的
  • IndexedDB的是W3C已被棄用,與許多類型和移動操作系統
  • 的WebSQL的版本不兼容
  • 的WebSQL返回673K的結果,但SQLite的返回1800K結果。 IndexedDB在Google上返回300K結果
  • 在IndexedDB,SQLite和WebSQL中,SQLite是唯一擁有官方網站的結果。

在命令行下面的命令,而你在你的科爾多瓦項目將安裝SQLite的插件安裝到您的科爾多瓦項目的目錄

cordova plugin add https://github.com/brodysoft/Cordova-SQLitePlugin 
相關問題