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>

Comments