Sök…


Anmärkningar

transaktioner

Transaktioner måste användas omedelbart efter att de har skapats. Om de inte används i den aktuella händelsslingan (i grund och botten innan vi väntar på något som en webbbegäran) kommer de att gå i ett inaktivt tillstånd där du inte kan använda dem.

Databaser kan bara ha en transaktion som skriver till en viss objektlagring åt gången. Så du kan ha så många du vill läsa från vår things butik, men bara en kan göra ändringar när som helst.

Testar för indexerad DB-tillgänglighet

Du kan testa för IndexedDB-stöd i den aktuella miljön genom att kontrollera om förekomsten av window.indexedDB :

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

Öppna en databas

Att öppna en databas är en asynkron operation. Vi måste skicka en begäran om att öppna vår databas och sedan lyssna på händelser så att vi vet när den är klar.

Vi öppnar en DemoDB-databas. Om den inte finns ännu skapas den när vi skickar förfrågan.

De 2 nedan säger att vi ber om version 2 av vår databas. Endast en version finns när som helst, men vi kan använda versionnumret för att uppgradera gamla data, som du ser.

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!");
};

Lägga till objekt

Allt som behöver hända med data i en IndexedDB-databas sker i en transaktion. Det finns några saker att notera om transaktioner som nämns i avsnittet Kommentarer längst ner på denna sida.

Vi kommer att använda databasen som vi satt upp i Öppna en databas.

// 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));

Hämtar data

Allt som behöver hända med data i en IndexedDB-databas sker i en transaktion. Det finns några saker att notera om transaktioner som nämns i avsnittet Kommentarer längst ner på denna sida.

Vi kommer att använda databasen som vi satt upp i Öppna en databas.

// 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow