2012-05-04 57 views
1

快速概覽我擁有的內容以及與之相關的問題。我有一個HTML5應用程序,我將使用PhoneGap作爲本機應用程序運行。它是本地實地研究站的一個小型數據收集應用程序。移動HTML5應用程序本地存儲

這個現場工作站的問題是它們很容易失去信號傳輸數據;因此我想將數據存儲在設備上供以後使用(或將其發送到服務器)。需要得到保存

數據如下:

*User Name (string) 
*Transect Color (string) 
*Transect Number (int) 
*Transect Board (char) 
*Salamander Name (string) 
*Snount-Vent Length (int) 
*Total Length (int) 
*Centipedes (int) 
*Red-Black Millipedes (int) 
*Brown Round Millipedes (int) 
*Brown Flat Millipedes (int) 

軟件本身將是一個獨立的應用程序,所以我希望它有一個方法來保存數據。

這樣做的最佳方式是使用jQuery &HTML5的組合嗎?我知道Web SQL已被棄用,但我相信這可能是我存儲這些數據的唯一方法。如果沒有,在發送之前動態存儲X個條目的最佳方式是什麼?

感謝您的幫助。

編輯:

如何對這種情況,當研究人員必須做一個「全斷面」 ...

研究者必須從位置到位置,直到每個斷面20個全數據收集有已完成。這需要20個不同的地點,每個地點都有不同數量的蠑螈和小動物進入。

如果localstorage只允許鍵:值對,那麼您將如何存儲更大的一組數據,以便在末尾卸載?

+0

您並不真的需要數據存儲的SQL部分來存儲一些數據。即使在IE中,localStorage仍然活着。 – coreyward

+0

我也會去'localStorage',但FWIW在很多實現方式中「很慢」,包括Chrome http://code.google.com/p/chromium/issues/detail?id=94382 – buley

回答

2

我在一個小key-value存儲包裹localStorage了一個巨大的風扇:

window.storage = { 
    store:localStorage, 
    get: function(key) { 
    try { 
     return JSON.parse(this.store[key]); 
    } catch(e) {}; 
    return undefined; 
    }, 
    set: function(key, value) { 
    try { 
     this.store[key] = JSON.stringify(value); 
    } catch(e) {}; 
    } 
} 

這使您可以直接引用window.storage。假設你已經有領域中描述了一個名爲row哈希包裹起來,你現在可以直接序列:

storage.set('myrow', row); 

正如你在row存儲的數據將被序列化,你可以創建一個document包含比更多的信息單個SQL行可能:

var document = { 
    property: 'foo', 
    nestedArray: [ 'foo', 'bar', 'baz' ], 
    nestedObj: { 'key': 'foo', 'key2': 'foo' } 
} 

storage.set('transectID', document); 

...你明白了。關鍵是你甚至可以將非常豐富的數據減少JSON.stringify並以可恢復的形式保存。

+0

檢查我編輯的擴展問題 – Brendan

+0

是的。我已經更新了我的解釋,更廣泛地處理了基於文檔的存儲的可能性(這聽起來可能是更適合您的解決方案嗎?) – rjz

+0

我不是javascript的忍者,但我確定'window'是一個只讀變量,你不能將它等同於一個數組,將編輯答案並將其更改爲其他內容 –

1

例如:

var data = { 
    name: 'x', 
    transect_color: 'red'. 
    ..... 
    .. 
}; 

localStorage.setItem('mydata', JSON.stringify(data)); // mydata is the name of storage 

而且讓你可以嘗試像以下數據:

var temp = localStorage.getItem('mydata'); 

if(temp != null) { 
    var dataJSON = JSON.parse(temp); 
} 

如果你想清除localStorage的數據,那麼用戶如下:

localStorage.clearItem('mydata'); 

您可以存儲多個數據,如下所示:

var x = []; // take an array to store all data 

x.push({a: 'x', b: 'y'}); 

localStorage.setItem('mydata', JSON.stringify(x)); 

// for further entry 

var temp = JSON.parse(localStorage.getItem('mydata')); // retrieve localStroage item 

temp.push({a: 'xx', b: 'yy'}) // push new data to array 

localStorage.setItem('mydata', JSON.stringify(t)); // overwrite the existing entry with new data 

console.log(JSON.parse(localStorage.getItem('data'))); // you will see your all data here 
+0

請查看我編輯的擴展問題 – Brendan

1

將大數據集存儲在localStorage中不是一個好主意。

WebSQL已棄用IndexedDB是較大瀏覽器內數據集的首選工具,但尚未在PhoneGap中使用(儘管它應該在路線圖中)。

違反直覺,即使WebSQL規範不會進一步發展WebSQL is still the most widely supported選項,而IndexedDB仍然是非常新生的。

如果您使用localStore路由,則與移動設備一樣,只要可能,您應該信任內存中的表示,並且只能在內存不足時從「磁盤」讀取。