2012-05-04 3 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? Я знаю, что веб-SQL устарел, но я считаю, что это единственный способ сохранить эти данные. Если нет, то каким будет лучший способ динамически хранить X-число записей перед отправкой?

Спасибо за помощь.

EDIT:

Как об этой ситуации, когда исследователь должен сделать «Full Трансект» ...

Исследователь должен идти от места к месту до 20 полных коллекций данных по каждому разрезу были сделано. Это влечет за собой 20 разных мест, каждый из которых имеет различное количество саламандр и тварей.

Как бы вы храпили этот гораздо больший набор данных, которые должны быть выгружены в конце, когда localstorage разрешает только ключи: пары значений?

+0

Вам действительно не нужна часть данных SQL для хранения данных, чтобы хранить некоторые данные. 'localStorage' жив и здоров, даже в IE. – coreyward

+0

Я бы пошел «localStorage», но FWIW «злой медленный» во многих реализациях, включая Chrome http://code.google.com/p/chromium/issues/detail?id=94382 – buley

ответ

2

Я огромный поклонник оберточной 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, как и в случае с мобильным телефоном, вам следует доверять представлению в памяти по возможности и только читать с диска, если вы не можете из памяти.

Смежные вопросы