javascript - 转储索引数据库数据

标签 javascript google-chrome-extension indexeddb dexie

正在开发 Chrome 扩展,需要与 IndexedDB 集成。试图弄清楚如何使用 Dexie.JS。找到了一堆样本。这些看起来并不太复杂。对于使用 Dexie 探索 IndexedDB,有一个特别有趣的具体示例:https://github.com/dfahlander/Dexie.js/blob/master/samples/open-existing-db/dump-databases.html

但是,当我运行上面的“转储实用程序”时,它没有看到 IndexedDB 数据库,并告诉我:当前源有数据库。

在开发人员工具Application 选项卡的“存储”下,我看到了我的IndexedDB 数据库。

这是某种权限问题吗?任何选项卡/用户都可以访问任何indexedDB数据库吗?

我应该看什么?

谢谢

最佳答案

在 chrome/opera 中,有一个非标准 API webkitGetDatabaseNames(),Dexie.js 使用它来检索当前源上的数据库名称列表。对于其他浏览器,Dexie 通过为每个源保留最新的数据库名称来模拟此 API,因此:

对于 Chromium 浏览器,Dexie.getDatabaseNames()将列出当前来源的所有数据库,但对于非 Chromium 浏览器,仅显示使用 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);
})();

关于javascript - 转储索引数据库数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46025699/

相关文章:

javascript - 如何使用 jQuery 获取成功的 ajax 响应并将其分配到变量中?

javascript - 如何分离和重新附加元素

java - Chrome 原生消息传递 Chrome 扩展

javascript - Chrome 扩展 : "Error handling response: TypeError: Cannot set property ' value' of null"

javascript - 为什么他们使用保留关键字 'continue' 来命名 IndexedDB 的 Cursor 对象中的函数?

javascript - 是否可以访问 nodejs 模块的 *loaded* 子级?

javascript - 在前端 promise 中链接相互依赖的服务器调用是一种不好的做法吗?

javascript - 在弹出的 chrome 扩展中加载 jquery

javascript - HTML5 - 大型 Blob 和持久本地存储

indexeddb - 索引数据库是否进行并行处理?