2016-08-17 4 views
2

Ich bin mit IndexedDB Start und das Rad nicht neu erfinden, ich bin mit Dexie.js https://github.com/dfahlander/Dexie.jsFehler mit IndexedDB Versionen und Dexie.js

ich die Datenbank erstellt, habe ich Daten und jetzt bin ich ein zu schaffen generische Funktion, die eine CSV-Datei erhält und die Datenbank in anderen Tabellen auffüllt.

also mehr oder weniger meinen Code

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

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

Bis hier alles in Ordnung ist

nun in Erfolg von Ajax-Request

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

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

Zum ersten Mal dieses Code ausgeführt ist alles OK , aber das nächste Mal bekomme ich diesen Fehler

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

Wenn ich die Datenbank lösche und den Code erst wieder neu starte, funktioniert das OK.

Irgendeine Idee? Ich mag nicht zu viel IndexedDB Version, es sieht frustrierend aus und ich bekomme nicht viel Hilfe im Net Danke.

Edit: Ich entdecke das ¿Problem/Bug/Verfahren ?. Wenn ich vor einer Versionsänderung nichts hinzufüge, habe ich dieses Problem nicht, aber weiß jemand, ob dies die normale Vorgehensweise ist?

Also .. wenn dies das Verfahren ist, kann ich keine Tabelle Dinamycally mit einer generischen Methode hinzufügen. Zuerst alle Deklarationen und dann Werte hinzufügen. Gibt es eine Möglichkeit, nach dem Hinzufügen von Werten eine Tabelle hinzuzufügen?

Nochmals bearbeiten ... Ich habe gerade festgestellt, dass ich eine andere Datenbank erstellen konnte. Ich werde Ergebnisse veröffentlichen. Aber jede Information über dieses Problem ist willkommen :)

Edit again ... Ich habe dinamycally eine andere Datenbank und jeder ist glücklich !!

Antwort

4

Das ist das zweite Mal, da der Code ausgeführt wird, die Datenbank es Version versucht, auf Version 2, aber Ihr Hauptcode noch 1.

an zu öffnen Wenn nicht die aktuelle Version, bei der Eröffnung Dexie versuchen installiert zu wissen dynamischer Modus. Dies wird durch die Angabe nicht jede Version gemacht:

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

und dynamisch eine neue Tabelle hinzu:

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. 
    }); 
} 

Diese Funktion gibt ein Versprechen zu warten, bis es vor der Verwendung die neue Tabelle fertig ist.

Wenn sich Ihre App in mehreren Browsern befindet, werden die anderen Fenster ihre Datenbankverbindung ebenfalls geschlossen, so dass sie der Datenbankinstanz zu keinem Zeitpunkt vertrauen können. Möglicherweise möchten Sie auf db.on ('versionchange') (https://github.com/dfahlander/Dexie.js/wiki/Dexie.on.versionchange) warten, um das Standardverhalten für diese Option zu überschreiben:

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. 
};