转储indexedDB数据

w1e3prcc  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(2)|浏览(186)

正在开发一个Chrome扩展,它需要与IndexedDB集成。试图弄清楚如何使用Dexie.JS。找到了一堆示例。这些示例看起来并不太复杂。有一个特定的示例特别有趣,可以在https://github.com/dfahlander/Dexie.js/blob/master/samples/open-existing-db/dump-databases.html上使用Dexie探索IndexedDB
但是,当我运行上面的一个“转储实用程序”时,它看不到IndexedDB数据库,并告诉我:There are databases at the current origin.
在开发者工具Application选项卡的Storage下,我看到了我的IndexedDB数据库。
这是某种权限问题吗?任何选项卡/用户都可以访问任何indexedDB数据库吗?
我该看什么?
谢谢你

qlckcl4x

qlckcl4x1#

在chrome/opera中,有一个非标准的API webkitGetDatabaseNames(),Dexie.js使用它来检索当前源上的数据库名称列表。对于其他浏览器,Dexie通过为每个源保持一个最新的数据库名称数据库来模拟这个API,因此:
对于chrome浏览器,Dexie.getDatabaseNames()将列出当前源的所有数据库,但对于非chrome浏览器,将仅显示使用Dexie创建的数据库。
如果您需要转储每个数据库的内容,请查看this issue,它基本上给出了:

interface TableDump {
    table: string
    rows: any[]
}

function export(db: Dexie): TableDump[] {
    return db.transaction('r', db.tables, ()=>{
        return Promise.all(
            db.tables.map(table => table.toArray()
                .then(rows => ({table: table.name, rows: rows})));
    });
}

function import(data: TableDump[], db: Dexie) {
    return db.transaction('rw', db.tables, () => {
        return Promise.all(data.map (t =>
            db.table(t.table).clear()
              .then(()=>db.table(t.table).bulkAdd(t.rows)));
    });
}

将这些函数与JSON.stringify()和JSON.parse()结合使用,以完全序列化数据。

const db = new Dexie('mydb');
db.version(1).stores({friends: '++id,name,age'});

(async ()=>{
    // Export
    const allData = await export (db);
    const serialized = JSON.stringify(allData);

    // Import
    const jsonToImport = '[{"table": "friends", "rows": [{id:1,name:"foo",age:33}]}]';
    const dataToImport = JSON.parse(jsonToImport);
    await import(dataToImport, db);
})();
l5tcr1uw

l5tcr1uw2#

使用当前indexedDB API将数据转储到JSON文件的工作示例,如以下位置所述:

下面的代码片段将从gmail设置中启用了Offline Mode的gmail帐户中转储最近的消息。

var dbPromise = indexedDB.open("your_account@gmail.com_xdb", 109, function (db) {
  console.log(db);
});

dbPromise.onerror = (event) => {
  console.log("oh no!");
};
dbPromise.onsuccess = (event) => {
  console.log(event);
  var transaction = db.transaction(["item_messages"]);
  var objectStore = transaction.objectStore("item_messages");
  var allItemsRequest = objectStore.getAll();

  allItemsRequest.onsuccess = function () {
    var all_items = allItemsRequest.result;
    console.log(all_items);

    // save items as JSON file
    var bb = new Blob([JSON.stringify(all_items)], { type: "text/plain" });
    var a = document.createElement("a");
    a.download = "gmail_messages.json";
    a.href = window.URL.createObjectURL(bb);
    a.click();
  };
};

从DevTools〉Sources〉Snippets运行上面的代码还可以让您设置断点并调试和检查对象。
确保将正确的数据库版本设置为indexedDB.open(...)的第二个参数。要查看浏览器使用的值,可以使用以下代码:

indexedDB.databases().then(
    function(r){
        console.log(r);
    }
);

相关问题