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>