IndexedDB处理onupgrade需要的数据迁移

Ste*_*fen 1 javascript database html5 indexeddb

我正在使用IndexedDB开发离线Web应用程序.因此,在版本更改的情况下,我想了很多关于数据迁移的内容.

例如,我在数据库版本3中有3个ObjectStore.现在我注意到,我应该在所有3个ObjectStore上都有一个特定的索引.但是之后不可能将索引添加到现有的ObjectStore,而不会丢失数据.

在"onupgradeneeded"事件中处理数据迁移的解决方案是什么?

小智 6

无需杀死StoreObject只需像这样更新它:

request.onupgradeneeded = function(evt) {

        var dataBase = evt.target.result;
        var txn = evt.target.transaction;
        //////////
        var storeCreateIndex = function (objectStore, name, options) {
            if (!objectStore.indexNames.contains(name)) {
                objectStore.createIndex(name, name, options);
            }
        }
        //////////
        var catalogItem, mangaItem, chapterItem, artworkItem;
        if (evt.newVersion != evt.oldVersion) {
            // Get exiting objectStore
            catalogItem = txn.objectStore('CatalogItem');
            mangaItem = txn.objectStore('MangaItem');
            chapterItem = txn.objectStore('ChapterItem');
            artworkItem = txn.objectStore('ArtworkList');
        } else {
            // Fist creation of database objectStore
            catalogItem = dataBase.db.createObjectStore("CatalogItem", { keyPath: "key" });
            mangaItem = dataBase.db.createObjectStore("MangaItem", { keyPath: "key" });
            chapterItem = dataBase.db.createObjectStore("ChapterItem", { keyPath: "key" });
            artworkItem = dataBase.db.createObjectStore("ArtworkList", { keyPath: "key" });
        }
        //////////
        storeCreateIndex(catalogItem, "popularity", { unique: false });
        storeCreateIndex(catalogItem, "author", { unique: false });
        storeCreateIndex(catalogItem, "status", { unique: false });
        storeCreateIndex(catalogItem, "isFavorite", { unique: false });
        storeCreateIndex(chapterItem, "isBookmarked", { unique: false });
        storeCreateIndex(chapterItem, "isDownloaded", { unique: false });
}
Run Code Online (Sandbox Code Playgroud)