2013-04-09 73 views
0

介紹PhoneGap的存儲

我已經花了一整天,但我就是不明白什麼在我的PhoneGap aplication發生。

在使用PhoneGap的從本地存儲我的應用程序即時通訊,存儲從網頁檢索到的新聞消息。我這樣做是因爲我希望用戶能夠脫機觀看內容。

當他們上線的應用程序將簡單地發送其最後一次更新日期的網站,該網站將只發送更改的記錄背部和應用程序並將其存儲在本地數據庫一次。

這一切都加載數據的時候第一次作品不錯,exept。

問題

當我開始了第一次的應用程序,它需要與網站上提供的所有記錄填充數據庫。 (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++; 
    } 
} 
+0

可能相關:http://stackoverflow.com/questions/4825455/web-sql-database-javascript-loop – pawel 2013-04-09 14:09:15

回答

0

經過三天的調查,我終於找到了解決辦法。我的數據庫未聲明足夠大:

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

大小以字節爲單位申報,所以實際上這個數據庫只有200KB

我把它改爲:

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

這是20MB。

我還是不明白爲什麼這個問題只存在於第一次加載的數據上。

感謝您的所有想法!

0

我認爲你必須使下面的SQL語句成爲前一個回調,而不是通過'for'循環它們。

現在無法提供示例,對不起。

+0

在有自己的文檔他們還利用一個for循環,這就是我從得到這個方法: HTTP ://docs.phonegap.com/en/2.5.0/cordova_storage_storage.md.html#SQLResultSetRowList – 2013-04-09 14:23:54

+1

在PhoneGap文檔中,結果是從數據庫查詢的回調函數的結果集中循環的。在你的情況下,你正在循環多個數據庫查詢。有很大的差異。 – zvona 2013-04-09 19:41:49

+0

你說得對,我已經重寫了代碼,它在第一篇文章中(編輯2)。但是,如果我嘗試加載超過39個帖子,錯誤仍然存​​在。 – 2013-04-11 18:29:11