Разработка автономного хранилища HTML5 для iOS/Android в 2011 году
Проблема:
Мне нужно решение agnostic (например, HTML5) для хранения и запроса 250 000 + строк данных в автономном режиме на устройстве типа телефона или планшета (например, iOS/Android). Идея заключается в том, что у меня есть люди, работающие в отдаленных районах без какого-либо сотового обмена данными, и им нужно запускать запросы по этим данным и редактировать их в автономном режиме. Частично он будет основан на геолокации, поэтому, если в области, в которой они находятся (используется GPS), есть активы, и они будут отображать эти активы и позволять им редактировать. Когда они возвращаются в офис, они могут синхронизировать данные с офисным сервером.
Причина, по которой я приближаюсь к этому с точки зрения веб-стандартов, заключается в том, чтобы сэкономить деньги и время, написав его один раз в HTML5, а затем он работает на нескольких платформах, а не дважды записывает его в Objective C и Java. Кроме того, если вы напишете что-то, что агностик платформы, то вы не заперты и не спускаетесь с корабля, когда все переходят к более новому. У нас было аналогичное приложение, написанное для Windows Mobile 5, теперь оно бесполезно, поскольку эта платформа мертва.
В автономной базе данных на устройстве должно быть:
- быстрый (ответы менее 2 секунд)
- потенциально выполняет объединения и имеет отношения с другими таблицами, способными запрашивать базу данных
- выберите данные в определенном диапазоне или критериях, например. по координатам x и y на основе показаний GPS.
Параметры:
локальное хранилище HTML5:
Хорошо для небольших объемов данных < 5000 ключей/значений, вы можете даже хранить в нем массивы/объекты, если вы преобразуете их в JSON.
Минусы:
- Для более чем 10 000 строк даже на высокопроизводительной машине браузер будет
медленное сканирование.
- Невозможно выполнить сложные запросы на данные, чтобы вытащить нужные вам данные, поскольку вам нужно перебирать все хранилище и вручную искать его.
- Ограничения с объемом хранения, который можно сохранить
База данных веб-SQL:
- Соответствует требованиям.
- Быстрый запуск запроса на 250 000 строк (1-2 сек.)
- Может создавать сложные запросы, объединения и т.д.
- Поддерживается Safari, Android и Opera, поэтому будет работать на устройствах iOS и Android.
Минусы:
- Устаревший с ноября 2010 года
- Недостаток безопасности с межсетевыми атаками. На самом деле проблема не в том, что мы не будем на хостинге.
IndexedDB:
Хранилище ключей/значений, похожее на локальное хранилище, за исключением индексов.
Минусы:
- Медленный запуск запроса на 200 000 строк (15-18 секунд)
- Невозможно выполнить сложные запросы
- Невозможно выполнить объединение с другими таблицами.
- Не поддерживается основными устройствами телефона или планшета, например. IPad/Android
- Стандарт не полностью
Это оставляет единственную возможность реализовать устаревший метод Web SQL, который может работать только год или около того. IndexedDB и локальное хранилище в настоящее время непригодны для использования.
Я не уверен, что Mozilla и Microsoft получили стандартную базу данных веб-SQL, и они не позволяют W3C. Предположительно между ними у них 77% рынка настольных браузеров. На продвинутых мобильных устройствах Mozilla и Microsoft имеют почти нулевое влияние, поскольку Safari, Opera и Android имеют более 90% доли рынка. Как Mozilla и Microsoft могут диктовать, какой стандарт следует использовать на мобильном рынке, где автономное хранилище, скорее всего, будет использоваться, не имеет никакого смысла.
В комментариях от Mozilla о том, почему они хотели пойти с IndexedDB, в основном, относятся к "эстетике разработчика", и им не нравится идея запуска SQL в JavaScript. Я не покупаю его.
-
В настоящее время предлагаемый стандарт уступает, и чрезвычайно простая реализация NoSQL медленна и даже не поддерживает дополнительные функции, которые нужны людям в базе данных. Существует много шаблонов кода для создания базы данных и получения данных, но они утверждают, что люди напишут несколько хороших библиотек абстракции поверх нее, что обеспечит более сложные функции. По состоянию на октябрь 2011 года их нигде не видно.
-
Они устарели существующий стандарт веб-SQL, который фактически работает и реализован в основных браузерах для мобильных/планшетов. В то время как их "новый" и "лучший" стандарты недоступны в основных мобильных браузерах.
-
Что мы, как разработчики, должны использовать в течение следующих 3-5 лет, когда спецификация IndexedDB может стать стандартизированной, иметь больше функций, реализованных в основных браузерах для мобильных/планшетов, и там есть некоторые приятные библиотеки, чтобы упростить работу?
W3C должен поддерживать параллельный стандарт базы данных Web SQL и просто исправлять проблемы. Он уже поддерживает основные мобильные платформы, и он работает очень хорошо. Тот факт, что Mozilla и Microsoft в качестве двух игроков с большинством настольных браузеров смогли получить этот стандартный отказ, довольно сомнительны и могут рассматриваться как попытка помешать продвижению на мобильных веб-платформах, пока они не смогут догнать и предложить конкурирующие решения для iOS/Safari и Android.
В заключение у кого-нибудь есть решение моей проблемы, которая будет работать для iOS/Android для телефонных/планшетных устройств. Возможно, хороший API-интерфейс обертки, который может использовать несколько реализаций баз данных в фоновом режиме с возможностью запросов, и позволяет вам выбрать, какая из баз данных имеет приоритет. Я видел такие вещи, как lawnchair, но я уверен, что он позволяет использовать локальное хранилище по умолчанию и возвращается к другим. Я думаю, я предпочел бы, чтобы он использовал веб-SQL (по умолчанию), а затем более медленные параметры.
Любая помощь для решения, очень ценимого, спасибо!
Ответы
Ответ 1
Я бы рекомендовал проверить библиотеку JayData, которая на самом деле имеет точную цель создания уровня доступа к агностическим данным для хранения данных для мобильных устройств, JayData предоставляет уровень абстракции JavaScript Language Query (JSLQ) и поддержку JavaScript CRUD и позволяет вам работать точно так же, как с различными автономными и онлайн-данными типы магазинов. JayData поддерживает обработку сложных объектов, а также связей между объектами либо локально, либо удаленно.
На момент написания JayData поддерживает следующие магазины или протоколы: webSQL (sqLite)/IndexedDB/OData/YQL/FBQL.
Ваша конкретная проблема с различными системами, предоставляющими разные механизмы хранения, может быть легко решена с помощью резервной функции поставщика JayData: она будет использовать любой уровень хранения, который может найти, и при этом по-прежнему предоставляет тот же API к потребительскому коду.
С учетом того, что WebSQL устарел до 2012 года: на момент написания этой статьи WebSQL по-прежнему имеет 95% -ный охват устройств, включая Samsung SmartTV и Amazon Kindle. Отследить разжигание модульных тестов WebSQL с помощью JayData.
Ответ 2
Я бы посмотрел CouchBase Lite. Это почти полнофункциональная реализация CouchDB, которая работает на Android и iOS.
iOS
Android
Если вы завернули приложение в нечто вроде PhoneGap, вы могли бы создать собственные приложения для HTML 5 для обеих платформ, и вам нужно было бы только сделайте крошечный бит программирования для Android/iOS для реализации CouchDB.
Плюсы:
- Механизм быстрого просмотра для запросов по многим строкам данных.
- Грязь простая и мощная поддержка репликации, запеченная в.
Минусы:
- Key-Value Store - потребуется некоторое время, чтобы привыкнуть.
Ответ 3
Я провел еще несколько исследований, ища решение для своего собственного проекта.
Похоже, что эта библиотека весьма перспективна: http://nparashuram.com/IndexedDBShim/
Он позволяет использовать IndexedDB API с WebSQL за кулисами.
Он тестирует передачу на последних iPad, iPhone 5, Android 4.2.2.
Надеюсь, это поможет кому-то.
Ответ 4
Я бы сказал вам использовать Corona. Это частная платформа, используемая для перекрестных мобильных приложений, которая поддерживает SQLite.
Доводы
- Это легко и имеет большую поддержку SQLite, и не нужно делать странные вещи с хранилищем Html5
против
- вы должны заплатить за это, если хотите использовать его в Android Market или на рынке iOS.
Вставьте сюда то, что они говорят об этом:
Corona включает поддержку баз данных SQLite на всех платформах. Это основанный на встроенной поддержке sqlite на iPhone, и скомпилированный версию SQLite на Android. Обратите внимание, что это увеличивает размер Android бинарный на 300K.
SQLite доступен во всех версиях Android, iPhone и iPad, так как а также в симуляторе Corona...
Ответ 5
"Я видел такие вещи, как lawnchair, но я уверен, что он позволяет использовать локальное хранилище по умолчанию и возвращается к другим. Я думаю, что я предпочел бы использовать Web SQL (по умолчанию), тогда более медленные параметры.
Это настраивается, каждый из "адаптеров" для систем хранения является автономным, вы можете передать адаптер в конструктор Lawnchair или, наоборот, изменить порядок его возврата к другим параметрам хранилища, объединив javascript файлы по-разному при создании библиотеки. например для indexed-db, а затем возвращается к sqlite, а затем передается sqlite:
git clone https://github.com/brianleroux/lawnchair.git
cd lawnchair
cat src/Lawnchair.js src/adapters/indexed-db.js src/adapters/webkit-sqlite.js src/adapters/gears-sqlite.js > my_lawnchair.js
Конечно, как показывают другие ответы, вы можете перенести свой html5 в родное приложение с помощью телефонной заставки и т.д., тогда у вас будет много вариантов, но если вы хотите придерживаться веб-стандартов, то это может быть хорошим способом до тех пор, пока мы не получим широкое внедрение IndexedDB.
Ответ 6
Почему бы не написать простой механизм хранения в javascript (который охватывает часть, основанную на стандартах)? По-видимому, вам не нужно ничего необычного, поэтому не нужно слишком много усилий, чтобы он работал.
Я бы сделал следующее:
- Хранить все в bson или аналогичном двоичном формате.
- Разбирайте и создавайте индексы в файлах и читайте при запуске.
- Запрос с использованием javascript и чтение из большого файла из вашего (автономного) веб-приложения.
- Сохранять обновленные объекты отдельно.
Это решение возможно только в том случае, если база данных достаточно проста. Но я думаю, что это может сработать - поддержка javascript хороша на мобильных устройствах.
Для вдохновения здесь является реализацией Btree + в javascript.
Для чтения локальных файлов вам понадобится файл API, который можно использовать для доступ к локальным файлам. Он поддерживается в большинстве современных браузеров, даже Safari 6. Я не смог определить, поддерживают ли текущие браузеры iPhone этот API.
Ответ 7
Стоит проверить мою библиотеку с открытым исходным кодом https://bitbucket.org/ytkyaw/ydn-db/wiki/Home
Модуль базы данных Javascript для механизмов хранения Indexeddb, WebDatabase (WebSQL) и WebStorage (localStorage), поддерживающих перенос версий, расширенный запрос и транзакцию.
Будучи библиотекой NoSQL, объединение является ручным, но не невозможным. В библиотеке уже есть встроенные алгоритмы объединения.