2016-08-22 1 views
2

Je suis en train de mettre à jour avec force une base de données en IndexedDB en envoyant une demande d'ouverture avec le numéro de version de la base de données actuelle incrémentée par un avec:mise à jour de travail dans IndexedDB

var openRequest = indexedDB.open("db-name", dbVariable.version + 1); 

Cependant l'événement onupgradeneeded est jamais déclenché et le openRequest reste dans l'état pending indéfiniment.

Qu'est-ce que je fais mal?

Existe-t-il une autre façon de mettre à jour de force une base de données dans IndexedDB?

EDIT

Dire que j'ai une fonction connect2db qui prend la variable version:

function connect2db(version) { 
    var openRequest = indexedDB.open("database-name", version); 

    openRequest.onsuccess = function(e) { 
     databaseVariable = e.target.result; 
    } 

    openRequest.onupgradeneeded = function(e) { 
     databaseVariable = e.target.result; 
     // Do schema update... 
    } 
} 

Et j'ai une autre circonstance où je voudrais mettre à jour le schéma de base de données:

connect2db(databaseVariable.version + 1); 

Supposons que darabaseVariable existe déjà et pointe vers une base de données

Lorsque j'ai essayé d'exécuter du code dans ce format, l'événement onupgradeneeded n'est jamais déclenché. Qu'est-ce qui pourrait mal tourner?

+1

Vous devez montrer plus de code environnant, comme comment et quand et où cela s'appelle. Appeler indexedDB.open avec une version supérieure et le même nom de base de données est la façon dont vous forcer une mise à jour. – Josh

Répondre

3

Le problème est probablement votre réglage de 'databaseVariable'. Vous ne pouvez pas faire cela comme vous le souhaitez. Vous voulez probablement revoir ou en apprendre davantage sur l'écriture de code asynchrone. Une réponse complète est très longue et a déjà été écrite plusieurs fois pour ce type de question. Envisagez d'examiner certaines réponses à d'autres questions avec la balise indexedDB.

Très brièvement, assurez-vous de comprendre comment les travaux suivants:

var x = 1; 
console.log(x); 
setTimeout(function() { 
    x = 2; 
    console.log(x); 
}, 0); 
x = 3; 
console.log(x); 

Votre code est écrit de telle sorte que vous vous attendez à voir 123, mais ce programme affiche 132. Assurez-vous de comprendre pourquoi.

+0

Pourriez-vous fournir des ressources, ou une recherche google de "javascript asynchrone" serait-elle suffisante? –

+0

J'ai trouvé une question différente liée à Indexeddb qui a répondu à ma question de mise à jour: http://stackoverflow.com/questions/20097662/how-to-create-multiple-object-stores-in-indexeddb?rq=1 –

+0

En fait , vous avez édité la question ci-dessus :) –