Définir le champ d'application dans les transactions IndexedDB

Qu'est-ce que IndexedDB ?

IndexedDB est une norme Web en constante évolution qui permet de stocker de grandes quantités de données structurées dans le navigateur et d'effectuer des recherches hautes performances sur ces données à l'aide d'index. En d'autres termes, IndexedDB est un magasin d'objets. Il ne s'agit pas d'une base de données relationnelle, qui comporte des tables avec des lignes et des colonnes de collections. Il s'agit d'une différence importante et fondamentale qui affecte la façon dont vous concevez et créez vos applications (pour en savoir plus, consultez les concepts de base).

Qu'est-ce qui a changé ?

Modifications, mes amis... Certaines modifications vont générer des erreurs si nous ne les traitons pas avec une simple modification de syntaxe.

À partir de la version 17, Chrome génère désormais une erreur si une transaction IndexedDB n'est pas limitée à un objet store. Étant donné que toutes les opérations de lecture et d'écriture de données sont effectuées dans des transactions, nous devons créer une transaction sur une base de données, spécifier la portée (par exemple, les magasins d'objets auxquels vous souhaitez accéder) et déterminer le type d'accès (lecture seule ou écriture).

Qu'est-ce que cela signifie dans le code ? Au lieu de transmettre un tableau vide à notre database.transaction:

var transaction = db.transaction([], IDBTransaction.READ_ONLY);

Vous devez définir la portée sur un store d'objets particulier ou une liste de stores d'objets:

// all stores (equivalent to what use to be marked as empty array. )
var transaction = db.transaction(db.objectStoreNames, IDBTransaction.READ_ONLY);

// multiple stores:
var transaction = db.transaction(['ObjectStoreName1', 'ObjectStoreName2'],
    IDBTransaction.READ_ONLY);

// single store - these are equivalent
var transaction = db.transaction(['ObjectStoreName'], IDBTransaction.READ_ONLY);
var transaction = db.transaction('ObjectStoreName', IDBTransaction.READ_ONLY);

Vous pouvez accélérer l'accès aux données en utilisant le champ d'application et le mode appropriés dans la transaction. Voici quelques conseils : Lorsque vous définissez la portée, spécifiez uniquement les magasins d'objets dont vous avez besoin. Vous pouvez ainsi exécuter plusieurs transactions avec des portées non superposées simultanément. Ne spécifiez un mode de transaction READ_WRITE que si nécessaire. Vous pouvez exécuter simultanément plusieurs transactions READ_ONLY avec des champs d'application qui se chevauchent, mais vous ne pouvez avoir qu'une seule transaction READ_WRITE pour un espace de stockage d'objets.

Autres sources:

À la prochaine !