2016-08-17 1 views
2

je suis en commençant par IndexedDB et de ne pas réinventer la roue à l'aide je suis Dexie.js https://github.com/dfahlander/Dexie.jserreurs avec les versions IndexedDB et Dexie.js

J'ai créé la base de données, j'ai ajouté des données et maintenant je suis la création d'un fonction générique qui obtient un fichier CSV et remplit la base de données dans les autres tables.

Ainsi, plus ou moins mon code est

// Creation and populate database and first table 
var db = new Dexie("database"); 
db.version(1).stores({table1: '++id, name'}); 

db.table1.add({name: 'hello'}); 

Jusqu'à ici tout est OK

Maintenant, dans le succès de la demande ajax

db.close(); 
db.version(2).stores({table2: '++id, name'}); 
db.open(); 

db.table2.add({name: 'hello'}); 

temps d'abord ce tout exécuter du code est OK , mais la prochaine fois que j'obtiens cette erreur

VersionError The operation failed because the stored database is a 
higher version than the version requested. 

Si je supprime la base de données et réexécute le code, la première fois fonctionne correctement.

Une idée? Je n'aime pas trop la version de IndexedDB, ça a l'air frustrant et je ne reçois pas beaucoup d'aide sur le Net Merci.

Editer: Je découvre le «problème/bug/procédure». Si je n'ajoute rien avant toute modification de version, je n'ai pas ce problème, mais est-ce que quelqu'un sait si c'est la procédure normale? Donc, si c'est la procédure, je ne peux pas ajouter de table dinamycally avec une méthode générique. D'abord toutes les déclarations, puis ajoutez des valeurs. Toute possibilité d'ajouter une table après avoir ajouté des valeurs? Editer à nouveau ... Je viens de me rendre compte que je pouvais créer une autre base de données. Je posterai des résultats. Mais toute information sur ce problème est la bienvenue :)

Modifier encore ... J'ai créé Dinamycally une autre base de données et tout le monde est heureux !!

Répondre

4

C'est parce que la deuxième fois que le code est exécuté, votre base de données est la version 2, mais votre code principal essaie toujours d'ouvrir à la version 1.

Si ne pas connaître la version installée, essayez d'ouvrir dans dexie mode dynamique. Cela se fait en ne spécifiant aucune version:

var db = new Dexie('database'); 
db.open().then(function (db) { 
    console.log("Database is at version: " + db.verno); 
    db.tables.forEach(function (table) { 
     console.log("Found a table with name: " + table.name); 
    }); 
}); 

Et d'ajouter dynamiquement une nouvelle table:

function addTable (tableName, tableSchema) { 
    var currentVersion = db.verno; 
    db.close(); 
    var newSchema = {}; 
    newSchema[tableName] = tableSchema; 

    // Now use statically opening to add table: 
    var upgraderDB = new Dexie('database'); 
    upgraderDB.version(currentVersion + 1).stores(newSchema); 
    return upgraderDB.open().then(function() { 
     upgraderDB.close(); 
     return db.open(); // Open the dynamic Dexie again. 
    }); 
} 

Cette dernière fonction retourne une promesse d'attendre jusqu'à ce qu'il soit fait avant d'utiliser la nouvelle table.

Si votre application réside dans plusieurs navigateurs, les autres fenêtres verront également leur connexion db fermée et ne pourront jamais croire que l'instance db sera ouverte à tout moment. Vous pouvez vouloir écouter db.on ('versionchange') (https://github.com/dfahlander/Dexie.js/wiki/Dexie.on.versionchange) pour remplacer le comportement par défaut pour cela:

db.on("versionchange", function() { 
    db.close(); // Allow other page to upgrade schema. 
    db.open() // Reopen the db again. 
     .then(()=> { 
      // New table can be accessed from now on. 
     }).catch(err => { 
      // Failed to open. Log or show! 
     }); 
    return false; // Tell Dexie's default implementation not to run. 
};