Библиотека JavaScript для соединения IndexedDB и WebSQL - PullRequest
17 голосов
/ 24 мая 2011

Мне любопытно, есть ли библиотека или проект для предоставления универсального интерфейса для IndexedDB или WebSQL, в зависимости от поддержки браузера пользователя. Если они используют Chrome / Safari, используйте WebSQL, если они используют Firefox или Internet Explorer, используйте IndexedDB.

Автор этого вопроса , похоже, создал собственное решение, но не предоставил никакого исходного кода.

Ответы [ 6 ]

15 голосов
/ 19 марта 2012

JasonCasden поделился огромным списком библиотек / упаковщиков на своей презентации Хранение в браузере и я .Вот список:

lawnchair
persistence.js
persistJS
amplify.store
localStorageDB
https://github.com/axemclion/IndexedDB
realStorage
YUI3 CacheOffline
dojox.storage
DomSQL
Impel
ActiveJS ActiveRecord
JazzRecord
picnet.data.DataManager
ShinyCar
lscache
Kizzy
Artemia
microcache.js
Store.js
9 голосов
/ 09 июня 2011

Возможно, вы захотите пойти с Шезлонгом , что довольно хорошо известно, как упомянул Гвидо Тапиа в вопросе, на который вы ссылаетесь.

Либо так, либо используйте его picnet.data.DataManager решение.

Также взгляните на persistence.js .

8 голосов
/ 09 августа 2012

Я написал YDN-DB для точной цели. Это оболочка базы данных для IndexedDB, WebSql и localStorage, созданная на основе библиотеки закрытия.

Цель

Красивый API для надежного, надежного, высокопроизводительного, крупномасштабного веб-приложения.

Особенности

  • Поддержка механизмов хранения IndexedDB, Web SQL и localStorage.
  • Хорошо протестированный модуль библиотеки замыканий.
  • Поддержка миграции версии, шифрование, запрос и транзакция .
  • Каждый вызов метода является атомарной транзакцией. Все методы асинхронные.
  • Следуйте обычному этикету javascript, например: единое пространство имен, без глобальных, без глобализации ошибок (если мы не говорили об этом в doc), без eval, параметризованный запрос, вот и все, ошибка генерирования ошибки кодирования.
  • Доступен плагин JQuery (см. Раздел загрузки).

Основное использование

Импорт последнего минимизированного JS-скрипта (см. Раздел загрузки) в ваши HTML-файлы. Это создаст один объект в глобальной области видимости, вызов ydn.db.Storage.

var db = new ydn.db.Storage('db name');

db.setItem('x', 'some value')

db.getItem('x').success(function(value) {
  console.log('x = ' + value);
}

Запрос

Рассчитать среднее с помощью запроса

q = db.query('customer').average('age');
avg = q.fetch()

Запрос ключа

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

Сделка

p1 = db.key('player', 1);
db.transaction(function() {
   p1.get().success(function(p1_obj) {
        p1_obj.health += 10;
        p1.put(p123_obj);
   });
}, [p1]);

Шифрование

Данные строковых значений могут быть дополнительно зашифрованы с использованием шифра SHA-1.

db = new ydn.db.Store('store name')
db.setSecret(passphase); // generally send from server side upon login
db.setItem(key, value, 3600*1000); // data expire on one hour
db.getItem(key); // data will be decrypted using the provided passphase
7 голосов
/ 22 февраля 2013

На вопрос дан ответ, я просто хочу поделиться обновлениями.

В мае 2012 года была выпущена JayData , которая представляет собой унифицированную библиотеку доступа к данным для JavaScript и помогает управлять данными в базах данных IndexedDB, WebSQL, SQLite, MongoDB, HTML5 localStorage и Facebook, OData, WebAPI Службы данных YQL с тем же синтаксисом JavaScript Language Query .

Переход на IndexedDB из WebSQL означает только изменение типа поставщика хранилища:

var todoDB = new TodoDatabase({ 
    provider: 'webSql', databaseName: 'MyTodoDatabase' });

var todoDB = new TodoDatabase({ 
    provider: 'indexedDB', databaseName: 'MyTodoDatabase' });

Если вы не укажете провайдера, библиотека обнаружит доступное хранилище браузера / устройства в следующем порядке приоритетов (WebSQL, IndexedDB, HTML5 localStorage).

Отказ от ответственности: я являюсь членом команды разработчиков проекта JayData с открытым исходным кодом

7 голосов
/ 20 декабря 2012

Взгляните на это: https://github.com/axemclion/IndexedDBShim

Это поли-заполнение для включения IndexedDB с использованием WebSql.Я пользуюсь им и думаю, что это довольно хорошо, но, как и у каждого решения, оно имеет некоторые ограничения, хотя вы можете разработать его практически без каких-либо проблем.

0 голосов
/ 09 июля 2016

Я надеюсь, что вы (OP) довольны решениями, предложенными в ответе, который вы приняли.

Для тех, кто все еще ищет способное решение (группа, которая может включать или не включатьOP), ознакомьтесь с BakedGoods .

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

При этом выполнение операций хранения в зависимости от того, какой тип базы данных поддерживается, зависит от ...

...указав соответствующие параметры операции и эквивалентные конфигурации для обоих типов баз данных:

//If the operation is a set(), and the referenced structures 
//don't exist, they will be created automatically.

var webSQLOptionsObj = {
    databaseName: "Example_DB",
    databaseDisplayName: "Example DB",
    databaseVersion: "",
    estimatedDatabaseSize: 1024 * 1024,
    tableData: {
        name: "Main",
        keyColumnName: "lastName",
        columnDefinitions: "(lastName TEXT PRIMARY KEY, firstName TEXT)"
    }, 
    tableIndexDataArray: [name: "First_Name_Index", columnNames: "(firstName)"]
};

var indexedDBOptionsObj = {
    databaseName: "Example_DB",
    databaseVersion: 1,
    objectStoreData: {
        name: "Main",
        keyPath: lastName,
        autoIncrement: false
    },
    objectStoreIndexDataArray: [
        {name: "First_Name_Index", keyPath: "firstName", unique: false, multiEntry: false}
    ],
};

var optionsObj = {
    conductDisjointly: false, 
    webSQL: webSQLOptionsObj, 
    indexedDB: indexedDBOptionsObj
};

... и выполнив операцию:

bakedGoods.set({
    data: [
        {value: {lastName: "Obama", firstName: "Barack"}}, 
        {value: {lastName: "Biden", firstName: "Joe"}}
    ],
    storageTypes: ["indexedDB", "webSQL"],
    options: optionsObj,
    complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});

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

Так что, если вы интенсивно используете эти типы функций, вы можете захотеть посмотреть в другом месте.

О, и ради полной прозрачности BakedGoods поддерживается вашими по-настоящему :).

...