转储indexedDB数据

莫西·史慕克勒

正在使用需要与IndexedDB集成的Chrome扩展程序。试图弄清楚如何使用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选项卡的“存储”下,我看到了我的IndexedDB数据库。

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

我应该看什么?

谢谢

大卫·法兰德

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

对于铬浏览器,Dexie.getDatabaseNames()将列出当前来源的所有数据库,但对于非铬浏览器,仅显示使用Dexie创建的数据库。

如果您需要转储每个数据库的内容,请查看此问题该问题基本上给出了:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章