Ricerca…


Osservazioni

Le transazioni

Le transazioni devono essere utilizzate immediatamente dopo la loro creazione. Se non vengono utilizzati nel ciclo degli eventi corrente (in pratica prima di attendere qualcosa come una richiesta Web) entreranno in uno stato inattivo in cui non è possibile utilizzarli.

I database possono avere solo una transazione che scrive in un determinato archivio oggetti alla volta. Così puoi averne quante ne vuoi leggere dal nostro negozio di things , ma solo una può apportare modifiche in un dato momento.

Test per la disponibilità di IndexedDB

È possibile verificare il supporto IndexedDB nell'ambiente corrente verificando la presenza della proprietà window.indexedDB :

if (window.indexedDB) {
    // IndexedDB is available
}

Aprire un database

L'apertura di un database è un'operazione asincrona. Dobbiamo inviare una richiesta per aprire il nostro database e quindi ascoltare gli eventi per sapere quando è pronto.

Apriremo un database DemoDB. Se non esiste ancora, verrà creato quando inviamo la richiesta.

Il 2 sotto dice che stiamo chiedendo la versione 2 del nostro database. Esiste solo una versione in qualsiasi momento, ma possiamo usare il numero di versione per aggiornare i vecchi dati, come vedrai.

var db = null, // We'll use this once we have our database
    request = window.indexedDB.open("DemoDB", 2);

// Listen for success. This will be called after onupgradeneeded runs, if it does at all
request.onsuccess = function() {
    db = request.result; // We have a database!

    doThingsWithDB(db);
};

// If our database didn't exist before, or it was an older version than what we requested,
// the `onupgradeneeded` event will be fired.
// 
// We can use this to setup a new database and upgrade an old one with new data stores
request.onupgradeneeded = function(event) {
    db = request.result;

    // If the oldVersion is less than 1, then the database didn't exist. Let's set it up
    if (event.oldVersion < 1) {
        // We'll create a new "things" store with `autoIncrement`ing keys
        var store = db.createObjectStore("things", { autoIncrement: true });
    }

    // In version 2 of our database, we added a new index by the name of each thing
    if (event.oldVersion < 2) {
        // Let's load the things store and create an index
        var store = request.transaction.objectStore("things");

        store.createIndex("by_name", "name");
    }
};

// Handle any errors
request.onerror = function() {
    console.error("Something went wrong when we tried to request the database!");
};

Aggiungere oggetti

Tutto ciò che deve accadere con i dati in un database IndexedDB avviene in una transazione. Ci sono alcune cose da notare sulle transazioni menzionate nella sezione Note in fondo a questa pagina.

Useremo il database che impostiamo in Apertura di un database.

// Create a new readwrite (since we want to change things) transaction for the things store
var transaction = db.transaction(["things"], "readwrite");

// Transactions use events, just like database open requests. Let's listen for success
transaction.oncomplete = function() {
    console.log("All done!");
};

// And make sure we handle errors
transaction.onerror = function() {
    console.log("Something went wrong with our transaction: ", transaction.error);
};

// Now that our event handlers are set up, let's get our things store and add some objects!
var store = transaction.objectStore("things");


// Transactions can do a few things at a time. Let's start with a simple insertion
var request = store.add({
    // "things" uses auto-incrementing keys, so we don't need one, but we can set it anyway
    key: "coffee_cup",
    name: "Coffee Cup",
    contents: ["coffee", "cream"]
});

// Let's listen so we can see if everything went well
request.onsuccess = function(event) {
    // Done! Here, `request.result` will be the object's key, "coffee_cup"
};


// We can also add a bunch of things from an array. We'll use auto-generated keys
var thingsToAdd = [{ name: "Example object" }, { value: "I don't have a name" }];

// Let's use more compact code this time and ignore the results of our insertions
thingsToAdd.forEach(e => store.add(e));

Recupero dati

Tutto ciò che deve accadere con i dati in un database IndexedDB avviene in una transazione. Ci sono alcune cose da notare sulle transazioni menzionate nella sezione Note in fondo a questa pagina.

Useremo il database che impostiamo in Apertura di un database.

// Create a new transaction, we'll use the default "readonly" mode and the things store
var transaction = db.transaction(["things"]);

// Transactions use events, just like database open requests. Let's listen for success
transaction.oncomplete = function() {
    console.log("All done!");
};

// And make sure we handle errors
transaction.onerror = function() {
    console.log("Something went wrong with our transaction: ", transaction.error);
};

// Now that everything is set up, let's get our things store and load some objects!
var store = transaction.objectStore("things");


// We'll load the coffee_cup object we added in Adding objects
var request = store.get("coffee_cup");

// Let's listen so we can see if everything went well
request.onsuccess = function(event) {
    // All done, let's log our object to the console
    console.log(request.result);
};


// That was pretty long for a basic retrieval. If we just want to get just
// the one object and don't care about errors, we can shorten things a lot
db.transaction("things").objectStore("things")
    .get("coffee_cup").onsuccess = e => console.log(e.target.result);


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow