Recherche…


Remarques

Transactions

Les transactions doivent être utilisées immédiatement après leur création. S'ils ne sont pas utilisés dans la boucle d'événement en cours (essentiellement avant d'attendre quelque chose comme une requête Web), ils entreront dans un état inactif où vous ne pourrez pas les utiliser.

Les bases de données ne peuvent contenir qu'une seule transaction à la fois dans un magasin d'objets particulier. Ainsi , vous pouvez avoir autant que vous voulez que notre lecture de things magasin, mais seulement on peut apporter des modifications à tout moment.

Test de disponibilité de la base de données indexée

Vous pouvez tester le support IndexedDB dans l'environnement actuel en recherchant la présence de la propriété window.indexedDB :

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

Ouvrir une base de données

Ouvrir une base de données est une opération asynchrone. Nous devons envoyer une demande pour ouvrir notre base de données, puis écouter les événements pour savoir quand elle est prête.

Nous allons ouvrir une base de données DemoDB. S'il n'existe pas encore, il sera créé lors de l'envoi de la demande.

Le 2 ci-dessous indique que nous demandons la version 2 de notre base de données. Une seule version existe à tout moment, mais nous pouvons utiliser le numéro de version pour mettre à niveau les anciennes données, comme vous le verrez.

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

Ajouter des objets

Tout ce qui doit se produire avec les données d'une base de données IndexedDB se produit dans une transaction. Il y a quelques points à noter concernant les transactions mentionnées dans la section Remarques au bas de cette page.

Nous utiliserons la base de données que nous avons configurée dans Ouverture d'une base de données.

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

Récupération des données

Tout ce qui doit se produire avec les données d'une base de données IndexedDB se produit dans une transaction. Il y a quelques points à noter concernant les transactions mentionnées dans la section Remarques au bas de cette page.

Nous utiliserons la base de données que nous avons configurée dans Ouverture d'une base de données.

// 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow