Maison > interface Web > Tutoriel H5 > le corps du texte

Explication détaillée de l'utilisation de la base de données indexeddb

php中世界最好的语言
Libérer: 2018-03-26 16:23:29
original
2308 Les gens l'ont consulté

Cette fois, je vais vous apporter une explication détaillée de l'utilisation de la base de données indexeddb. Quelles sont les précautions lors de l'utilisation de la base de données indexeddb. Ce qui suit est un cas pratique, jetons un coup d'œil.

Avant-propos

Dans le stockage local de HTML5, il existe une base de données appelée indexedDB, qui est une base de données NoSQL stockée localement sur le client. Elle peut stocker beaucoup de choses. données. D'après l'article précédent : HTML5 Advanced Series : Web Storage, nous savons que le stockage Web peut accéder localement à des données simples de manière pratique et flexible, mais pour une grande quantité de stockage structuré, les avantages d'indexedDB sont encore plus évidents. Voyons ensuite comment indexedDB stocke les données.

Se connecter à la base de données

Un site Web peut avoir plusieurs bases de données indexées DB, mais le nom de chaque base de données est unique. Nous devons nous connecter à une base de données spécifique via le nom de la base de données.

var request = indexedDB.open('dbName', 1);  // 打开 dbName 数据库
request.onerror = function(e){              // 监听连接数据库失败时执行
    console.log('连接数据库失败');
}
request.onsuccess = function(e){            // 监听连接数据库成功时执行
    console.log('连接数据库成功');
}
Copier après la connexion

Nous utilisons la méthode indexedDB.open pour nous connecter à la base de données. Cette méthode reçoit deux paramètres, le premier est le nom de la base de données et le second est le numéro de version de la base de données. Cette méthode renvoie un objet IDBOpenDBRequest, représentant un objet de requête pour se connecter à la base de données. Nous pouvons définir les méthodes à exécuter si la connexion réussit ou échoue en écoutant les événements onsuccess et onerror de l'objet requête.

Étant donné que l'API indexedDB ne permet pas à l'entrepôt de données de la base de données de changer dans la même version, vous devez transmettre un nouveau numéro de version dans la méthode indexedDB.open pour mettre à jour la version afin d'éviter des modifications répétées de la base de données dans la même version. Le numéro de version doit être un entier !

var request = indexedDB.open('dbName', 2);  // 更新版本,打开版本为2的数据库
// ...
request.onupgradeneeded = function(e){
    console.log('新数据库版本号为=' + e.newVersion);
}
Copier après la connexion

Nous définissons la méthode à exécuter lors de la mise à jour de la version de la base de données en écoutant l'événement onupgradeneeded de l'objet requête.

Fermez la base de données

Après une connexion réussie à la base de données à l'aide de indexedDB.open, un objet IDBOpenDBRequest sera renvoyé Nous pouvons appeler la méthode close de cet objet pour fermer. la base de données.

var request = indexedDB.open('dbName', 2);
// ...
request.onsuccess = function(e){
    console.log('连接数据库成功');
    var db = e.target.result;
    db.close();
    console.log('数据库已关闭');
}
Copier après la connexion

Supprimer la base de données

indexedDB.deleteDatabase('dbName');
console.log('数据库已删除');
Copier après la connexion

Créer un objetEntrepôt

magasin d'objets( L'entrepôt d'objets) constitue la base de la base de données indexedDB. Il n'y a pas de table de base de données dans indexedDB et l'entrepôt d'objets est équivalent à une table de base de données.

var request = indexedDB.open('dbName', 3);
// ...
request.onupgradeneeded = function(e){
    var db = e.target.result;
    var store = db.createObjectStore('Users', {keyPath: 'userId', autoIncrement: false});
    console.log('创建对象仓库成功');
}
Copier après la connexion

La méthode db.createObjectStore reçoit deux paramètres, le premier est le nom de l'entrepôt d'objets, le deuxième paramètre est un paramètre facultatif et la valeur est un objet js. L'attribut keyPath dans cet objet est la clé primaire, qui équivaut à l'identifiant en tant que clé primaire dans la table de base de données. Si l'attribut autoIncrement est faux, cela signifie que la valeur de la clé primaire n'augmentera pas automatiquement et que la valeur de la clé primaire doit être spécifiée lors de l'ajout de données.

Remarque : dans la base de données, le nom de l'entrepôt d'objets ne peut pas être répété, sinon le navigateur signalera une erreur.

Créer un index

indexedDB Dans la base de données, un index est créé via un attribut de l'objet de données Lors de la récupération dans la base de données, seul l'attribut défini comme index. peut être utilisé.

var request = indexedDB.open('dbName', 4);
// ...
request.onupgradeneeded = function(e){
    var db = e.target.result;
    var store = db.createObjectStore('newUsers', {keyPath: 'userId', autoIncrement: false});
    var idx = store.createIndex('usernameIndex','userName',{unique: false})
    console.log('创建索引成功');
}
Copier après la connexion

La méthode store.createIndex reçoit trois paramètres. Le premier est le nom de l'index et le second est l'attribut de l'objet de données. Dans l'exemple ci-dessus, l'attribut userName est utilisé pour créer l'index. . Le troisième paramètre est les paramètres Select, la valeur est un objet js. L'attribut unique de cet objet est vrai, ce qui signifie que les valeurs d'index ne peuvent pas être les mêmes, c'est-à-dire que le nom d'utilisateur des deux données ne peut pas être le même, et s'il est faux, ils peuvent être les mêmes.

Basé sur les transactions

Dans indexedDB, toutes les opérations de données ne peuvent être effectuées qu'au sein des transactions. Après vous être connecté avec succès à la base de données, vous pouvez utiliser la méthode de transaction de l'objet IDBOpenDBRequest pour démarrer une transaction en lecture seule ou une transaction en lecture-écriture.

var request = indexedDB.open('dbName', 5);
// ...
request.onupgradeneeded = function(e){
    var db = e.target.result;
    var tx = db.transaction('Users','readonly');
    tx.oncomplete = function(e){
        console.log('事务结束了');
    }
    tx.onabort = function(e){
        console.log('事务被中止了');
    }
}
Copier après la connexion

La méthode db.transaction reçoit deux paramètres. Le premier paramètre peut être une chaîne ou un tableau. Si c'est une chaîne, c'est un nom d'entrepôt d'objets. un tableau composé de noms d'entrepôts d'objets, la transaction peut opérer sur n'importe quel entrepôt d'objets dans les paramètres. Le deuxième paramètre est Mode de transaction Lorsque la lecture seule est transmise, seules les opérations de lecture peuvent être effectuées sur l'entrepôt d'objets et les opérations d'écriture ne peuvent pas être effectuées. Readwrite peut être transmis pour les opérations de lecture et d'écriture.

Données d'opération

  1. add() : Ajouter des données. Reçoit un paramètre, qui est l'objet qui doit être enregistré dans l'entrepôt d'objets.

  2. put() : Ajouter ou modifier des données. Reçoit un paramètre, qui est l'objet qui doit être enregistré dans l'entrepôt d'objets.

  3. get() : Obtenez des données. Reçoit un paramètre, qui est la valeur de clé primaire des données à obtenir.

  4. delete() : 删除数据。接收一个参数,为需要获取数据的主键值。

var request = indexedDB.open('dbName', 5);
// ...
request.onsuccess = function(e){
    var db = e.target.result;
    var tx = db.transaction('Users','readwrite');
    var store = tx.objectStore('Users');
    var value = {
        'userId': 1,
        'userName': 'linxin',
        'age': 24
    }
    var req1 = store.put(value);        // 保存数据
    var req2 = store.get(1);            // 获取索引userId为1的数据
    req2.onsuccess = function(){
        console.log(this.result.userName);  // linxin
    }
    var req3 = store.delete(1);             // 删除索引为1的数据
    req3.onsuccess = function(){
        console.log('删除数据成功');        // 删除数据成功
    }
}
Copier après la connexion

add 和 put 的作用类似,区别在于 put 保存数据时,如果该数据的主键在数据库中已经有相同主键的时候,则会修改数据库中对应主键的对象,而使用 add 保存数据,如果该主键已经存在,则保存失败。

检索数据

上面我们知道使用 get() 方法可以获取数据,但是需要制定主键值。如果我们想要获取一个区间的数据,可以使用游标。游标通过对象仓库的 openCursor 方法创建并打开。

openCursor 方法接收两个参数,第一个是 IDBKeyRange 对象,该对象创建方法主要有以下几种:

// boundRange 表示主键值从1到10(包含1和10)的集合。
// 如果第三个参数为true,则表示不包含最小键值1,如果第四参数为true,则表示不包含最大键值10,默认都为false
var boundRange = IDBKeyRange.bound(1, 10, false, false);
// onlyRange 表示由一个主键值的集合。only() 参数则为主键值,整数类型。
var onlyRange = IDBKeyRange.only(1);
// lowerRaneg 表示大于等于1的主键值的集合。
// 第二个参数可选,为true则表示不包含最小主键1,false则包含,默认为false
var lowerRange = IDBKeyRange.lowerBound(1, false);
// upperRange 表示小于等于10的主键值的集合。
// 第二个参数可选,为true则表示不包含最大主键10,false则包含,默认为false
var upperRange = IDBKeyRange.upperBound(10, false);
Copier après la connexion

openCursor 方法的第二个参数表示游标的读取方向,主要有以下几种:

  1. next : 游标中的数据按主键值升序排列,主键值相等的数据都被读取

  2. nextunique : 游标中的数据按主键值升序排列,主键值相等只读取第一条数据

  3. prev : 游标中的数据按主键值降序排列,主键值相等的数据都被读取

  4. prevunique : 游标中的数据按主键值降序排列,主键值相等只读取第一条数据

var request = indexedDB.open('dbName', 6);
// ...
request.onsuccess = function(e){
    var db = e.target.result;
    var tx = db.transaction('Users','readwrite');
    var store = tx.objectStore('Users');
    var range = IDBKeyRange.bound(1,10);
    var req = store.openCursor(range, 'next');
    req.onsuccess = function(){
        var cursor = this.result;
        if(cursor){
            console.log(cursor.value.userName);
            cursor.continue();
        }else{
            console.log('检索结束');
        }
    }
}
Copier après la connexion

当存在符合检索条件的数据时,可以通过 update 方法更新该数据:

cursor.updata({
    userId : cursor.key,
    userName : 'Hello',
    age : 18
});
Copier après la connexion

可以通过 delete 方法删除该数据:

cursor.delete();
Copier après la connexion

可以通过 continue 方法继续读取下一条数据,否则读到第一条数据之后不再继续读取:

cursor.continue();
Copier après la connexion

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

html5新增加的标签有哪些

使用phonegap克隆和删除联系人

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!