数据库索引(IndexedDB)

概述

本文演示了在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和数据库

deleteDatabasedeleteObjectStore接口用于删除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/