数据库索引(IndexedDB)
PUBLISHED
概述
本文演示了在Tizen中使用数据库索引(IndexedDB)。 本地存储介质只存储 配对的key-value,如果你想存储具有多个value的key,数据库索引(IndexedDB)就是一个很好的例子,它使用了B-Tree。
创建IndexedDB
在Tizen中创建IndexedDB,使用基于IndexedDB的WebKit中的 webkitIndexedDB窗口属性。 首先,它检查数据库是否存在,如果存在则调用onSuccess回调函数,否则在数据库创建的地方调用onupgradeneeded回调函数,创建objectstore,该objectstore只是一些表。 下面的代码显示了如何创建数据库PeopleDB和objectsotre人。 Objectstore创建两个关键字:姓名和电子邮件,在这里我们可以指定是否应包含唯一的值,以避免重复。
function createDb(){ var tizenDB = {}; window.indexedDB = window.webkitIndexedDB ; var request = window.indexedDB.open("PeopleDB"); request.onsuccess = function (evt) { console.log("inside onsuccess"); db = request.result; }; request.onerror = function (evt) { console.log("IndexedDB error: " + evt.target.errorCode); }; request.onupgradeneeded = function(evt) { console.log("inside onupgradeneeded"); var objectStore = evt.currentTarget.result.createObjectStore( "people", { keyPath: "id", autoIncrement: true }); objectStore.createIndex("name", "name", { unique: false }); objectStore.createIndex("email", "email", { unique: true }); for (i in peopleData) { objectStore.add(peopleData[i]); console.log("added objectstore to db"); } }; }
读ObjectStore数据
下面的代码显示了从object store “people”中检索数据。 我们需要使用读模式打开事务对话框,读取数据库,它将返回指向objectstore的指针。 调用objectstore中的opencursor方法来检索键值对
function showDb(){ var tizenDB = {}; window.indexedDB = window.webkitIndexedDB ; var request = window.indexedDB.open("PeopleDB"); request.onsuccess = function (evt) { console.log("inside onsuccess"); db = request.result; var IDBTransaction = window.webkitIDBTransaction; var transaction = db.transaction("people", IDBTransaction.READ_WRITE); var objectStore = transaction.objectStore("people"); var request = objectStore.openCursor(); request.onsuccess = function(evt) { var cursor = evt.target.result; if (cursor) { var textContent = "id: " + cursor.key + " is " + cursor.value.name + " "; console.log("data----------" + textContent) ; cursor.continue(); } else { console.log("No more entries!"); } }; }; }
读取特定的记录
不同于整个objectstore,用户可以使用IDBKeyRange检索特定的记录,如下面的代码所示。
function showDataRecord() { var tizenDB = {}; window.indexedDB = window.webkitIndexedDB ; var request = window.indexedDB.open("PeopleDB"); request.onsuccess = function (evt) { db = request.result; var IDBTransaction = window.webkitIDBTransaction; var transaction = db.transaction("people", IDBTransaction.READ_WRITE); var objectstore = transaction.objectStore("people"); if(objectstore != null ) { var index = objectstore.index("email" ); var IDBKeyRange = window.webkitIDBKeyRange; if(IDBKeyRange != null) { console.log("range is not null"); var range = IDBKeyRange.only("john@company.com") ; var request = index.get("john@company.com") ; if( request != null){ request.onsuccess=function(event){ var cursor = event.target.result; alert(cursor); }} else console.log("request is null"); } } } }
删除ObjectStore和数据库
deleteDatabase和deleteObjectStore接口用于删除objectstore和数据库。
数据库索引功能使用了IndexedDB封装库。
使用此IndexedDB库,可以用简单的接口创建数据库,如下所示。
源
https://github.com/jensarps/IDBWrapper
创建ObjectStore
封装库librabry提供了一个借口用来创建ObjectStore,需要指定版本,storename和success回调函数,该回调函数会在创建ObjectStore后被调用。
function createDBUsingWrapper(){ customers = new IDBStore({ dbVersion: 1, storeName: 'customer', keyPath: 'id', autoIncrement: true, onStoreReady: function(){ console.log('Store ready!'); } }); }
将数据添加到ObjectStore
要添加索引到一个对象中,需要使用下面的代码,添加成功后会执行onSuccess回调函数。
function addToDB(){ console.log("inside addToDB"); var dude = { firstname: 'John', lastname: 'Doe', age: 52, emails: [ 'johndoe@example.com', 'jd@example.com' ] }; var onsuccess = function(id){ console.log('Data is added: ' + id); } var onerror = function(error){ console.log('Error', error); } customers.put(dude, onsuccess, onerror); }
从ObjectStore读数据
如下面的代码所示,使用索引的id可以从数据库中检索数据。
function readFromDB(){ var id = 1; var onsuccess = function(data){ console.log('here is our dude:', data); } var onerror = function(error){ console.log('Oh noes, sth went wrong!', error); } customers.get(id, onsuccess, onerror); }
如下面的代码,用户也可以使用过滤器从数据存储中检索数据。 每个搜索条目都会调用onItem回调函数。
customers.iterate(onItem, { index: 'lastname', keyRange: IDBKeyRange, order: 'ASC', filterDuplicates: false, writeAccess: false, onEnd: onEndCallback, onError: onErrorCallback });
参考
http://www.w3.org/TR/IndexedDB
http://www.codeproject.com/Articles/325135/Getting-Started-with-IndexedDB
http://jensarps.de/2011/11/25/working-with-idbwrapper-part-1
http://jensarps.de/2012/11/13/working-with-idbwrapper-part-2/