Функции оболочки для IndexedDB - PullRequest
9 голосов
/ 03 октября 2011

Мне нужно создать автономное веб-приложение HTML5 для устройства iPad / планшета, где пользователь может загрузить набор данных (таблицу данных) с сервера и сохранить его на устройстве.Затем пользователь может отключиться от сервера и просматривать / редактировать данные локально на устройстве.Это для людей, которые работают в отдаленных районах, где нет сотовой связи и им нужно собирать / обновлять данные.Когда они возвращаются в офис, они могут синхронизировать / загружать данные обратно на сервер.Причина, по которой он должен быть HTML5, заключается в том, что он не зависит от платформы, то есть может запускать его на iOS, Android и т. Д., Если у него есть современный веб-браузер, поддерживающий HTML5.

Теперь я уже построил систему, используяЛокальное хранилище HTML5 (для данных) и кэш автономного приложения HTML5 (для страниц / css / js / images), и оно работает достаточно хорошо с небольшими наборами данных (я могу просматривать, редактировать и сохранять в автономном режиме и загружать / синхронизировать в режиме онлайн),Теперь мне нужно масштабировать до 10000 строк данных.Он работает, но довольно медленно и зависает браузер на 10 сек при загрузке на четырехъядерный процессор Intel с 8 ГБ памяти.

Так что я исследовал несколько лучших альтернатив, чем локальное хранилище:

1)WebSQL: мог бы запрашивать данные с использованием языка SQL и выполнять объединения и т. Д. Проблема в том, что он устарел и больше не поддерживается, поэтому я не хочу тратить время на создание чего-либо для него.

2) IndexedDB: использует хранилище объектов (которое технически я уже храню объекты с использованием локального API хранения и хранения с использованием JSON).Потенциально быстрее, так как он использует индексы с SQL Lite Backend.Существует много стандартного кода для выполнения простых задач, таких как создание базы данных, добавление в нее, чтение из нее, итерация по ней.Я просто хочу сделать простой запрос типа select(xyc, abc).where(abc = 123).limit(20), но вместо этого мне нужно написать много кода JavaScript для этого.Как написать свой собственный код для объединения таблиц, каких-нибудь примеров?

Я нашел один плагин jQuery , который может упростить жизнь.Есть ли какие-либо другие библиотеки или другие библиотеки, которые облегчают боль при использовании IndexedDB?

Большое спасибо!

Ответы [ 4 ]

4 голосов
/ 21 августа 2012

У меня есть оболочка веб-базы данных с открытым исходным кодом , которая поддерживает IndexedDB и WebSql.

Миграция версий выполняется за смыслом.Следующий код переносится (или инициализируется) до версии 2.

schema_ver2 = {
    version: 2,
    size: 2 * 1024 * 1024, // 2 MB
    stores: [{
        name: 'ydn_obj',
        keyPath: 'id.value',
        indexes: [{
            name: 'age',
            type: 'INTEGER'  // type is require for WebSql
        }]
    }]
}
db = new ydn.db.Storage('db name', schema_ver2)

Запрос очень гибкий и мощный.Например:

q = db.query('customer').when('age', '>=', 18 , '<', 25).where('sex', '=', 'FEMALE')
young_girls = q.fetch(10, 2); // limit and offset

Опять с более эффективным запросом диапазона ключей, если индексирован возраст:

q = db.query('customer', 'age').bound(18, 25, true).where('sex', '=', 'FEMALE')

Также поддерживается транзакция .

p123 = db.tkey('player', 123);
db.runInTransaction(function() {
   p123.get().success(function(p123_obj) {
        p123_obj.health += 10;
        p123.put(p123_obj);
   });
}, [p123]);
3 голосов
/ 21 августа 2012

Попробуйте linq2indexeddb . Он имеет интерфейс запроса, который вы хотите + с помощью indexeddb shim для websql , также поддерживается API WebSQL.

1 голос
/ 08 октября 2011

Рассматривали ли вы [Шезлонг] [1]? Он обеспечивает хорошую абстракцию от базового хранилища, есть также плагины для запросов, агрегирования и разбивки на страницы данных. Как пример запроса:

  // basic searching
    this.where('record.name === "brian"', 'console.log(records)') 
    this.where('record.name != ?', username, 'console.log(records)')

    // sorting results
    this.where('name === "brian"').asc('active', 'console.log(records)')

Единственный потенциальный недостаток, который я вижу, заключается в том, что он не обрабатывает миграции, а его универсальность не позволяет создавать индексы и т. Д.

Что касается объединений, IndexedDB спроектирован как хранилище, ориентированное на документы (без SQL), а не реляционная база данных, однако, учитывая, что это распространенный сценарий, кажется, есть два варианта:

1) Курсор перебирает элементы данных 2) Если приведенное выше слишком медленное, вы также можете создать выделенное хранилище объектов значения ключа, которое затем можно будет использовать для поиска по индексу в соответствующем хранилище. В зависимости от количества требований к соединению это может быть рутиной.

0 голосов
/ 13 сентября 2017

Я думаю, JsStore будет работать на вас.

Допустим, ваш запрос выглядит примерно так:Это будет

var Connection = new JsStore.Instance("YourDbName");
Connection.select({
    From: "table_name"
    Where: {
        Column1: 'abc',
    },
    Limit:20,
    OnSuccess:function (results){
        console.log(results);
    },
    OnError:function (error) {
        console.log(error);
    }
});

Таким образом, вы можете написать sql-подобный запрос, используя JsStore .

...