Автономная база данных Phonegap

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

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

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

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


person noway    schedule 17.08.2012    source источник
comment
SQLite отлично работает и с Blackberry.   -  person SpetsnaZ    schedule 28.08.2012
comment
вы думаете о возможном решении для реализации нативного на всех 4 платформах? реляционная база данных действительно необходима, разве недостаточно (двоичного) файла?   -  person    schedule 29.08.2012
comment
Я тоже хочу решение, которое охватывает все 4 платформы. Или есть какой-нибудь плагин или альтернатива sqlite, который мы можем использовать на телефонах Windows?   -  person Akash Deshpande    schedule 04.04.2013
comment
использовать базу данных SQLCipher.   -  person Monty    schedule 04.04.2013


Ответы (5)


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

<сильный>1. Локальное хранилище ::

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

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

Поместить элемент в LocalStorage

localStorage.setItem("bar", foo);

or

localStorage["bar"] = foo;

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

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

or

var foo = localStorage["bar"];

<сильный>2. База данных SQLite (более удобная, более постоянная)

Настройте базу данных

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);

            }
        });
    });

РЕДАКТИРОВАТЬ :: Я забыл добавить последний вариант :)

<сильный>3. Собственное хранилище на всех устройствах

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

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

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

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

Вот дополнительная информация о работе с существующей базой данных SQLite. В этом примере зашифрованный.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;
person SashaZd    schedule 04.04.2013
comment
Кстати, это (т.е. LocalStorage и SQLite) работает в WP8 и WP7, iOS и Android. Проверено успешно! (Я добавляю этот комментарий, так как вы сказали, что не можете заставить SQL работать на WP.) - person SashaZd; 04.04.2013
comment
Это (или любое другое решение) сработало? Время розыгрыша заканчивается через 13 часов. - person SashaZd; 10.04.2013
comment
Создает ли код SQLite базу данных и можете ли вы повторно использовать базу данных, созданную при первом запуске приложения? - person Lunatikzx; 18.04.2013
comment
да. Созданный вами файл базы данных будет храниться в каталоге документов приложения на iOS (и я предполагаю, что в аналогичном месте на Android, я не уверен). Когда вы откроете приложение в следующий раз, оно будет ссылаться на тот же файл базы данных, что и при первом создании. - person SashaZd; 18.04.2013
comment
То есть обновление требует от нас только изменения версии кода базы данных? - person Lunatikzx; 18.04.2013
comment
LocalStorage действительно удобен, но вряд ли здесь решение, учитывая, что в вопросе указано, что будут храниться файлы › 100mb. LocalStorage имеет ограничение в 5 МБ (если только я не упустил какой-то секретный трюк PhoneGap, чтобы обойти это). - person Adam; 14.05.2014
comment
@ Адам Да, именно поэтому я дал комбинированный ответ. Вы можете использовать LocalStorage в качестве своего рода поиска, но хранить фактические данные в SQLite или с помощью плагина Native storage, как я упоминал выше. - person SashaZd; 12.08.2014
comment
Комбинированный подход великолепен, но в ответе не ясно, нужно ли вам комбинировать LocalStorage с одним из двух других или что LocalStorage имеет довольно небольшой предел размера, который намного меньше, чем требуется в вопросе. Я просто хотел сделать это более ясным :) - person Adam; 12.08.2014
comment
У вас есть учебник по зашифрованному сайту для приложений? - person JohnAndrews; 31.03.2015
comment
Что если я хочу использовать предварительно заполненную базу данных в Windows Phone 8.1, iOS и Android? - person Uttam Kukadiya; 07.04.2016
comment
Спасибо за ваш ответ. Пожалуйста, у вас есть дополнительная информация, ссылки о Native Storage на всех устройствах - person JoCuTo; 14.03.2017

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

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

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

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

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

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

На мой взгляд, SQLite — лучший доступный вариант, поскольку это внутрипроцессная библиотека, которая реализует автономный, бессерверный, не требующий настройки транзакционный механизм базы данных SQL. Более того, лимиты SQLite, кажется, покрывают ваши потребности:

Максимальное возможное значение для SQLITE_MAX_PAGE_COUNT — 2147483646. При использовании с максимальным размером страницы 65536 максимальный размер базы данных SQLite составляет около 140 терабайт.

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

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

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

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

person Apostolos Emmanouilidis    schedule 22.08.2012
comment
Это очень общий ответ. Не указано, как заставить его работать на Android или Windows Phone, как было задано в вопросе. - person SashaZd; 04.04.2013

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

Я рассматривал Indexed DB, но мобильные браузеры в iOS и Android не поддерживают это. Локальное веб-хранилище не подходит из-за его жесткого ограничения в 5 МБ. Поэтому я решил использовать стандарт базы данных Web SQL (http://www.w3.org/TR/webdatabase/), хотя он устарел. До сих пор мой опыт использования базы данных Web SQL был очень хорошим. Операции с базой данных выполняются очень хорошо и очень надежно на мобильных устройствах, которые я поддерживаю (iPad 2, iPad 3, Motorola Xyboard, Samsung Galaxy Tab 2). Кроме того, Phonegap предоставляет API JavaScript для работы с этим стандартом (см. 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

person jkwuc89    schedule 08.04.2013

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

person Ahmed Wahba    schedule 25.10.2017

См. эти вопросы/ответы:

person UBIK LOAD PACK    schedule 28.08.2012
comment
если вы считаете, что это повторяющийся вопрос, отметьте его. Ваш ответ не должен быть просто ссылкой на другие вопросы и ничего больше. - person SashaZd; 09.04.2013
comment
по крайней мере, выберите набор вопросов и ответов, который, по вашему мнению, лучше всего отвечает на этот вопрос, и перенаправьте туда. Или опубликуйте лучший выбор в качестве ответа. Не просто связывайте все возможные ответы. - person SashaZd; 09.04.2013