Офлайн-база данных Phonegap

Я хочу сохранить несколько автономных данных больших в пользовательском телефоне (более 100 МБ) в базе зашифрованной. Если возможно, я также хочу распространять базу данных, предварительно заполненную. Я также видел этот.

Я знаю о веб-базе данных, но поскольку он обесценился, мне не рекомендуется работать с этим.

Я также видел некоторые сторонние плагины, такие как SQLite Plugin, но он работает только для устройств iOS и Android, но я нацелен на 4 платформы (ios, android, ежевики, окна)

Есть ли другое решение, кроме написания моего?

Ответ 1

Недавно я сделал приложение, которое требовало этого, нацеливая те же ОС. Вы можете использовать комбинацию из двух баз данных:

1. LocalStorage::

Проверить наличие локального хранилища

function supports_html5_storage() {
  try {
    return 'localStorage' in window && window['localStorage'] !== null;
  } catch (e) {
    return false;
  }
}

Задайте элемент в LocalStorage

localStorage.setItem("bar", foo);

или

localStorage["bar"] = foo;

Получить элемент из LocalStorage

var foo = localStorage.getItem("bar");

или

var foo = localStorage["bar"];

2. База данных SQLite (более удобная, более устойчивая)

Настройте свой DB

var shortName = 'BHCAppDB'; 
var version = '1.0'; 
var displayName = 'BHCAppDB'; 
var maxSize = 65535; 
if (!window.openDatabase){ 
     alert('!! Databases are not supported in this Device !! \n\n We are sorry for the inconvenience and are currently working on a version that will work on your phone'); 
}
db = openDatabase(shortName, version, displayName,maxSize);
createAllTables(db);

Создайте свои таблицы

function createAllTables(db){
    db.transaction(function(transaction){
        transaction.executeSql("CREATE TABLE IF NOT EXISTS Profile(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT, gender TEXT,age INTEGER)");
}

Выполнить SQL-запрос

transaction(function(transaction){
        var rowCount = 'SELECT * FROM Profile';
        transaction.executeSql(rowCount,[],function(transaction,result){
            if(result.rows.length == 0){
                var sqlString = 'INSERT INTO Profile (name,gender,age) VALUES("自己","Female",18)';
                transaction.executeSql(sqlString);

            }
        });
    });

EDIT:: Я забыл добавить в последний вариант:)

3. Встроенное хранилище на всех устройствах

Это лучшая часть Phonegap. Вы можете вызвать собственный класс плагина на всех устройствах, используя вызов плагина Phonegap. Во время вызова вы можете передавать параметры классу, а собственный класс может хранить ваши данные в самой ОС.

Например: в iOS вы создаете плагин .h и .m class и регистрируете его с помощью файла Cordova.plist. После этого вам нужно отправить вызов классу из JavaScript с помощью Phonegap. После того, как параметры были получены с использованием NSDictionary или любого другого типа NSArray, вы можете вызвать класс CoreData для хранения НЕОГРАНИЧЕННЫХ объемов данных. Вы никогда не исчерпаете память.

Это можно сделать аналогичным образом и для всей остальной ОС:

Для шифрования попробуйте следующее: SQLCipher

Ниже приведена дополнительная информация о работе с существующей базой данных SQLite. В этом примере encrypted.db - это новая база данных, которую вы создаете и прагма.

ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'secret'; -- create a new encrypted database
CREATE TABLE encrypted.t1(a,b); -- recreate the schema in the new database (you can inspect all objects using SELECT * FROM sqlite_master)
INSERT INTO encrypted.t1 SELECT * FROM t1; -- copy data from the existing tables to the new tables in the encrypted database
DETACH DATABASE encrypted;

Ответ 2

В спецификации W3C для webdatabase упоминается, что Рабочая группа веб-приложений продолжает работу над двумя другими спецификациями, связанными с хранением: Web Storage и Индексированный API баз данных.

Таким образом, спецификация веб-базы данных больше не активна, но действуют две другие спецификации.

Веб-хранилище можно использовать для хранения данных локально в браузере пользователя. Для этого есть следующие объекты:

  • localStorage, который хранит данные без истечения срока действия
  • sessionStorage, который хранит данные за один сеанс

Веб-хранилище не рекомендуется для вашего случая (более 100 МБ), поскольку в спецификации W3C указано, что:

Рекомендуется использовать в основном произвольный предел в пять мегабайт на начало координат.

На мой взгляд, SQLite - лучший доступный вариант, поскольку он представляет собой библиотеку in-process, которая реализует автономный, безсерверный, нулевой конфигурации, транзакционный механизм СУБД SQL. Более того, ограничения SQLite, по-видимому, покрывают ваши потребности:

Самый большой возможный параметр для SQLITE_MAX_PAGE_COUNT - 2147483646. При использовании с максимальным размером страницы 65536 это дает максимальную базу данных SQLite размером около 140 терабайт.

Что касается требований к шифрованию, вы должны рассмотреть SQLCipher, который является расширением SQLite.

SQLCipher - это расширение SQLite, обеспечивающее прозрачное 256-битное шифрование AES файлов базы данных. На сегодняшний день он открыт с открытым исходным кодом, спонсируется и поддерживается Zetetic LLC. В мобильном пространстве SQLCipher широко используется в Apple iOS, а также Nokia/QT в течение некоторого времени.

Альтернативным вариантом является шифрование и дешифрование ваших данных при записи и чтении базы данных.

Надеюсь, это поможет.

Ответ 3

У мобильного приложения, над которым я работаю, есть аналогичное требование. Он требует автономного доступа к таблице деталей, которая содержит около 500 000 различных частей. Источник этой таблицы извлекается с сервера, получая его JSON через четко определенный URL GET.

Я считал индексированную БД, но мобильные браузеры внутри iOS и Android не поддерживают это. Веб-локальное хранилище не является вариантом из-за его жесткого ограничения 5 МБ. Итак, я решил использовать стандарт базы данных веб-SQL (http://www.w3.org/TR/webdatabase/), даже несмотря на то, что он устарел. Мой опыт до сих пор с использованием базы данных веб-SQL был очень хорошим. Операции с базой данных выполняются очень хорошо и очень надежны на поддерживаемых мобильных устройствах (iPad 2, iPad 3, Motorola Xyboard, Samsung Galaxy Tab 2). Кроме того, Phonegap предоставляет JavaScript API для работы с этим стандартом (см. http://docs.phonegap.com/en/2.5.0/cordova_storage_storage.md.html#Storage).

Я написал утилиту Java, которая преобразует загруженные данные JSON в базу данных SQLite, файлы которой упакованы как часть Android APK или пакета приложений iOS.

Когда начинается мобильное приложение Phonegap, он использует собственный код для проверки каталога личных данных приложения для наличия файлов базы данных SQLite. Если файлов нет, собственный код копирует файлы базы данных из пакета приложения.

Моя реализация основана на примере кода, который я нашел по ссылке ниже. Надеюсь, это поможет. Сообщите мне, есть ли у вас какие-либо вопросы о моей конкретной реализации.

http://gauravstomar.blogspot.com/2011/08/prepopulate-sqlite-in-phonegap.html

Ответ 4

Я попытался использовать LokiJS в качестве локальной базы данных и нашел, что он полезен в нереляционных данных. В моем случае я извлекаю данные, хранящиеся с помощью MongoDB на сервере, но зависит от характера вашей системы.