IndexedDB

<html>

<head>

<title>Teste IndexedDB</title>

</head>

<body>

<script>

window.onload = function(){

// http://www.w3.org/TR/IndexedDB/

// https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB

// http://www.html5rocks.com/pt/tutorials/indexeddb/todo/

/*

Lógica segundo o livro HTML5:

- Iniciar uma transação.

- Fazer a requisição para realizar uma operação com o banco, por exemplo, adicionar ou requisitar um dado armazenado.

- Aguardar a finalização e resultado da requisição monitorando o apropriado evento do DOM.

- Manipular o resultado da requisição.

*/

// - - - - - - - - - - //

// CRIAR BANCO DE DADOS //

// - - - - - - - - - - //

/*

// Abrir banco de dados

var request = indexedDB.open('library');

// Se não existe cria

request.onupgradeneeded = function() {

alert("banco de dados precisa ser criado");

// The database did not previously exist, so create object stores and indexes.

// mapeia banco de dados

var db = request.result;

// cria objeto (tabela)

var store = db.createObjectStore("books", {keyPath: "isbn"}); // Chave primaria isbn

// cria indices para busca

var titleIndex = store.createIndex("by_title", "title", {unique: true}); // Chave unica title

var authorIndex = store.createIndex("by_author", "author"); // Chave author

// Populate with initial data.

store.put({title: "Quarry Memories", author: "Fred", isbn2: 123456}); // Dados armazenados estilo JSON

store.put({title: "Water Buffaloes", author: "Fred", isbn2: 234567});

store.put({title: "Bedrock Nights", author: "Barney", isbn2: 345678});

alert("Dados iniciais inserido");

db.close();

};

request.onsuccess = function(){

alert("banco de dados aberto (ja criado)");

var db = request.result;

db.close;

}

*/

// - - - - - - - - - - - - - //

// INSERIR NO BANCO DE DADOS //

// - - - - - - - - - - - - - //

/*

// Abrir banco de dados

var request = indexedDB.open('library');

// Se já existe faz mapeamento para variavel

request.onsuccess = function() {

// mapeia banco de dados

db = request.result;

alert("banco de dados aberto");

// Inicia uma transação de leitura e escrita

var tx = db.transaction("books", "readwrite");

// seleciona objeto

var store = tx.objectStore("books");

// Popula banco de dados

store.put({title: "Livro1", author: "Silvio", isbn: 123});

store.put({title: "Livro2", author: "Silvio", isbn: 1234});

store.put({title: "Livro3", author: "Silvio", isbn: 12345});

tx.oncomplete = function() {

// All requests have succeeded and the transaction has committed.

alert("Dados inseridos");

};

db.close();

};

*/

// - - - - - - - - - - - - - - //

// CONSULTAR NO BANCO DE DADOS (by_title) //

// - - - - - - - - - - - - - - //

/*

// Abrir banco de dados

var request = indexedDB.open('library');

request.onsuccess = function() {

// mapeia banco de dados

db = request.result;

alert("banco de dados aberto");

// Inicia uma transação de leitura

var tx = db.transaction("books", "readonly");

// Seleciona objeto

var store = tx.objectStore("books");

// Seleciona indice para pesquisa

var index = store.index("by_title");

// Consulta o objetos cuja o title é Livro1

var request2 = index.get("Livro1"); // Case sensitive

request2.onsuccess = function() {

var matching = request2.result;

if (matching !== undefined) {

// A match was found.

console.log(matching.isbn, matching.title, matching.author);

} else {

// No match was found.

console.log(null);

}

};

db.close();

}

*/

// - - - - - - - - - - - - - - //

// CONSULTAR NO BANCO DE DADOS (by_author) //

// - - - - - - - - - - - - - - //

/*

// Abrir banco de dados

var request = indexedDB.open('library');

request.onsuccess = function() {

// mapeia banco de dados

db = request.result;

alert("banco de dados aberto");

// Inicia uma transação de leitura

var tx = db.transaction("books", "readonly");

// Seleciona objeto

var store = tx.objectStore("books");

// Seleciona indice para pesquisa

var index = store.index("by_author");

// Consulta todos os objetos cuja o author é silvio

var request2 = index.openCursor(IDBKeyRange.only("Silvio")); // Case sensitive

request2.onsuccess = function() {

var cursor = request2.result;

if (cursor) {

// Called for each matching record.

console.log(cursor.value.isbn, cursor.value.title, cursor.value.author);

cursor.continue(); // Anda com o ponteiro

} else {

// No more matching records.

console.log(null);

}

};

db.close();

}

*/

// - - - - - - - - - - - - - - //

// INSERIR NO BANCO DE DADOS //

// - - - - - - - - - - - - - - //

/*

// Abrir banco de dados

var request = indexedDB.open('library');

request.onsuccess = function() {

// mapeia banco de dados

db = request.result;

alert("banco de dados aberto");

// Inicia uma transação de leitura e escrita

var tx = db.transaction("books", "readwrite");

// Seleciona objeto

var store = tx.objectStore("books");

// Insere novo objeto

var request2 = store.put({title: "Water Buffaloes", author: "Slate", isbn: 987654});

request2.onerror = function() {

// The uniqueness constraint of the "by_title" index failed.

console.log(request2.error);

// Could call request.preventDefault() to prevent the transaction from aborting.

};

tx.onabort = function() {

// Otherwise the transaction will automatically abort due the failed request.

console.log(tx.error);

};

db.close();

}

*/

// - - - - - - - - - - - - - - //

// ATUALIZAR BANCO DE DADOS //

// - - - - - - - - - - - - - - //

/*

var request = indexedDB.open("library", 3); // Request version 3.

request.onupgradeneeded = function(event) {

var db = request.result;

if (event.oldVersion < 1) {

// Version 1 is the first version of the database.

var store = db.createObjectStore("books", {keyPath: "isbn"});

var titleIndex = store.createIndex("by_title", "title", {unique: true});

var authorIndex = store.createIndex("by_author", "author");

}

if (event.oldVersion < 2) {

// Version 2 introduces a new index of books by year.

var bookStore = request.transaction.objectStore("books");

var yearIndex = bookStore.createIndex("by_year", "year");

}

if (event.oldVersion < 3) {

// Version 3 introduces a new object store for magazines with two indexes.

var magazines = db.createObjectStore("magazines");

var publisherIndex = magazines.createIndex("by_publisher", "publisher");

var frequencyIndex = magazines.createIndex("by_frequency", "frequency");

}

};

request.onsuccess = function() {

db = request.result; // db.version will be 3.

};

*/

// - - - - - - - - - - - - - - //

// INSERIR COM AUTOINCREMENT //

// - - - - - - - - - - - - - - //

/*

// Abrir banco de dados

var request = indexedDB.open("library6");

// Se não existe cria

request.onupgradeneeded = function() {

alert("banco de dados precisa ser criado");

// The database did not previously exist, so create object stores and indexes.

// mapeia banco de dados

var db = request.result;

store1 = db.createObjectStore("store1", { autoIncrement: true });

store1.put("a"); // Will get key 1

store2 = db.createObjectStore("store2", { autoIncrement: true });

store2.put("a"); // Will get key 1

store1.put("b"); // Will get key 2

store2.put("b"); // Will get key 2

db.close();

}

request.onsuccess = function(){

alert("banco de dados aberto (ja criado)");

var db = request.result;

db.close;

}

*/

// - - - - - - - - - - - - - - //

// APAGAR REGISTRO //

// - - - - - - - - - - - - - - //

/*

// Abrir banco de dados

var request = indexedDB.open("library10");

// Se não existe cria

request.onupgradeneeded = function() {

alert("banco de dados precisa ser criado");

// The database did not previously exist, so create object stores and indexes.

// mapeia banco de dados

var db = request.result;

store = db.createObjectStore("store1", { autoIncrement: true });

store.put("a"); // Will get key 1

store.delete(1);

store.put("b"); // Will get key 2

store.clear();

store.put("c"); // Will get key 3

store.delete(IDBKeyRange.lowerBound(0));

store.put("d"); // Will get key 4

db.close();

}

request.onsuccess = function(){

alert("banco de dados aberto (ja criado)");

var db = request.result;

db.close;

}

*/

// - - - - - - - - - - - - - - //

// INSERIR REGISTRO AUTOINCREMENT COM CHAVE //

// - - - - - - - - - - - - - - //

/*

// Abrir banco de dados

var request = indexedDB.open("library11");

// Se não existe cria

request.onupgradeneeded = function() {

alert("banco de dados precisa ser criado");

// The database did not previously exist, so create object stores and indexes.

// mapeia banco de dados

var db = request.result;

store = db.createObjectStore("store1", { autoIncrement: true });

store.put("a"); // Will get key 1

store.put("b", 3); // Will use key 3

store.put("c"); // Will get key 4

store.put("d", -10); // Will use key -10

store.put("e"); // Will get key 5

store.put("f", 6.00001); // Will use key 6.0001

store.put("g"); // Will get key 7

store.put("f", 8.9999); // Will use key 8.9999

store.put("g"); // Will get key 9

store.put("h", "foo"); // Will use key "foo"

store.put("i"); // Will get key 10

store.put("j", [1000]); // Will use key [1000]

store.put("k"); // Will get key 11

db.close();

}

request.onsuccess = function(){

alert("banco de dados aberto (ja criado)");

var db = request.result;

db.close;

}

*/

// - - - - - - - - - - - - - - //

// ALTERAR NO BANCO DE DADOS //

// - - - - - - - - - - - - - - //

/*

// Abrir banco de dados

var request = indexedDB.open('library');

request.onsuccess = function() {

// mapeia banco de dados

db = request.result;

alert("banco de dados aberto");

// Inicia uma transação de leitura e escrita

var tx = db.transaction("books", "readwrite");

// Seleciona objeto

var store = tx.objectStore("books");

// Seleciona indice para pesquisa

var index = store.index("by_title");

// Consulta o objetos cuja o title é Livro1

var request2 = index.get("Livro1"); // Case sensitive

request2.onsuccess = function() {

var data = request2.result;

if (data !== undefined) {

data.title = "Livro10";

console.log(data);

// Put this updated object back into the database.

var requestUpdate = store.put(data);

//var requestUpdate = store.put(data,key);

requestUpdate.onerror = function () {

// Do something with the error

alert("Erro alterar");

};

requestUpdate.onsuccess = function () {

// Success - the data is updated!

alert("Dados alterados");

};

}else{

alert("Nao encontrado");

}

}

db.close();

}

*/

// - - - - - - - - - - - - - - //

// Lista todos //

// - - - - - - - - - - - - - - //

/*

// Abrir banco de dados

var request = indexedDB.open('library');

request.onsuccess = function() {

// mapeia banco de dados

db = request.result;

alert("banco de dados aberto");

// Inicia uma transação e seleciona objeto

var store = db.transaction("books").objectStore("books"); // Chave default

//var store = db.transaction("books").objectStore("books").index("by_author"); // Chave author

//Consulta todos os objetos e armazena resultado em event

//store.openCursor(IDBKeyRange.only("Silvio")).onsuccess = function(event){ // Filtra pela chave

store.openCursor().onsuccess = function(event){

// consulta resultado do event

var cursor = event.target.result;

if(cursor){

console.log(cursor.key + " | " + cursor.value.isbn + " " + cursor.value.title + " " + cursor.value.author);

cursor.continue();

}else{

alert("No more entries!");

}

}

db.close();

}

*/

// - - - - - - - - - - - - - - //

// Lista todos e armazena em array //

// - - - - - - - - - - - - - - //

/*

// Abrir banco de dados

var request = indexedDB.open('library');

request.onsuccess = function() {

// mapeia banco de dados

db = request.result;

alert("banco de dados aberto");

var arrayObjetos = [];

// Inicia uma transação e seleciona objeto

var store = db.transaction("books").objectStore("books"); // Chave default

//Consulta todos os objetos e armazena resultado em event

store.openCursor().onsuccess = function(event){

// consulta resultado do event

var cursor = event.target.result;

if(cursor){

arrayObjetos.push(cursor.value);

cursor.continue();

}else{

console.log(arrayObjetos);

console.log(arrayObjetos.length);

console.log(arrayObjetos[0]);

}

}

db.close();

}

*/

// - - - - - - - - - - - - - - //

// Lista todos com indice //

// - - - - - - - - - - - - - - //

/*

// Abrir banco de dados

var request = indexedDB.open('library');

request.onsuccess = function() {

// mapeia banco de dados

db = request.result;

alert("banco de dados aberto");

// Inicia uma transação e seleciona objeto

var store = db.transaction("books").objectStore("books").index("by_author"); // Chave author

// Only match "Silvio"

var singleKeyRange = IDBKeyRange.only("Silvio");

// Match anything past "Silvio", including "Silvio"

var lowerBoundKeyRange = IDBKeyRange.lowerBound("Silvio");

// Match anything past "Silvio", but don't include "Silvio"

var lowerBoundOpenKeyRange = IDBKeyRange.lowerBound("Silvio", true);

// Match anything up to, but not including, "Silvio"

var upperBoundOpenKeyRange = IDBKeyRange.upperBound("Silvio", true);

// Match anything between "Fred" and "Silvio", but not including "Silvio"

var boundKeyRange = IDBKeyRange.bound("Fred", "Silvio", false, true);

//Search for strings that start with X ( SQL LIKE 'prefix%' )

var boundKeyRange = IDBKeyRange.bound(prefix, prefix + '\uffff', false, false)

/*

http://www.codeproject.com/Articles/744986/How-to-do-some-magic-with-indexedDB

IndexedDB is out-of-the-box only capable of doing the following search operations:

- IDBKeyRange.only() - exact match (case sensitive!)

- IDBKeyRange.bound() - Find all objects where key is within given range

- IDBKeyRange.upperBound() - Find all objects where key is lower than given key

- IDBKeyRange.lowerBound() - Find all objects where key is greater than given key

As you can see, above, there seems to be no way of doing things like:

- Case insensitive searh

- Find all objects where key is any of ("a", "b", "c" or "d") (SQL 'IN')

- Find keys that contains a given substring (SQL LIKE)

- Logical OR or AND

- Etc... ( the list could be long...)

*/

//Consulta todos os objetos e armazena resultado em event

store.openCursor(singleKeyRange).onsuccess = function(event){ // Filtra pela chave

//store.openCursor(singleKeyRange, "prev").onsuccess = function(event){ // Filtra pela chave e ordem decrescente

//store.openCursor(singleKeyRange, "nextunique").onsuccess = function(event){ // Filtra pela chave e unico (distinct)

// consulta resultado do event

var cursor = event.target.result;

if(cursor){

console.log(cursor.key + " | " + cursor.value.isbn + " " + cursor.value.title + " " + cursor.value.author);

cursor.continue();

}else{

alert("No more entries!");

}

}

db.close();

}

*/

// - - - - - - - - - - - - - - //

// Lista todos de varios objetos //

// - - - - - - - - - - - - - - //

/*

// Abrir banco de dados

var request = indexedDB.open('library6');

request.onsuccess = function() {

// mapeia banco de dados

db = request.result;

alert("banco de dados aberto");

// Inicia uma transação de leitura

var tx = db.transaction(["store1","store2"], 'readonly');

// Seleciona objeto

var store1 = tx.objectStore("store1");

//Consulta todos os objetos e armazena resultado em event

store1.openCursor().onsuccess = function(event){

// consulta resultado do event

var cursor = event.target.result;

if(cursor){

console.log(cursor.key + " | " + cursor.value);

cursor.continue();

}else{

alert("No more entries!");

}

}

// Seleciona objeto

var store2 = tx.objectStore("store2");

//Consulta todos os objetos e armazena resultado em event

store2.openCursor().onsuccess = function(event){

// consulta resultado do event

var cursor = event.target.result;

if(cursor){

console.log(cursor.key + " | " + cursor.value);

cursor.continue();

}else{

alert("No more entries!");

}

}

db.close();

}

*/

// - - - - - - - - - - - - - - //

// Apagar objetos //

// - - - - - - - - - - - - - - //

/*

var request = indexedDB.open('library20',2);

// Se não existe cria

request.onupgradeneeded = function(event) {

alert("banco de dados precisa ser criado");

// mapeia banco de dados

var db = request.result;

if(event.oldVersion < 1){

var store = db.createObjectStore("books1");

var store = db.createObjectStore("books2");

var store = db.createObjectStore("books3");

var store = db.createObjectStore("books4");

var store = db.createObjectStore("books5");

}

if(event.oldVersion < 2){

db.deleteObjectStore("books1");

db.deleteObjectStore("books2");

db.deleteObjectStore("books3");

}

db.close;

}

request.onsuccess = function(){

alert("banco de dados aberto (ja criado)");

var db = request.result;

db.close;

}

*/

// - - - - - - - - - - - - - - //

// Apagar banco de dados //

// - - - - - - - - - - - - - - //

/*

indexedDB.deleteDatabase('library1');

indexedDB.deleteDatabase('library2');

indexedDB.deleteDatabase('library3');

indexedDB.deleteDatabase('library4');

indexedDB.deleteDatabase('library5');

indexedDB.deleteDatabase('library7');

indexedDB.deleteDatabase('library8');

indexedDB.deleteDatabase('library9');

indexedDB.deleteDatabase('library12');

indexedDB.deleteDatabase('library13');

*/

// testar se suporte indexedDB

if (window.indexedDB) {

criarBanco();

}

}

</script>

ola

</body>

</html>