转储 indexedDB 数据
Dumping indexedDB data
正在开发 Chrome 扩展,需要与 IndexedDB 集成。试图弄清楚如何使用 Dexie.JS
。找到了一堆样品。那些看起来不太复杂。在 https://github.com/dfahlander/Dexie.js/blob/master/samples/open-existing-db/dump-databases.html
上有一个特别有趣的具体示例,用于使用 Dexie 探索 IndexedDB
但是,当我 运行 上面的 "dump utility," 它没有看到 IndexedDB 数据库时,告诉我:There are databases at the current origin.
在开发人员工具 Application
选项卡的存储下,我看到了我的 IndexedDB
数据库。
这是某种权限问题吗?任何 tab/user 都可以访问任何 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);
})();
使用当前 indexedDB API 将数据转储到 JSON 文件的工作示例,如以下所述:
- https://developers.google.com/web/ilt/pwa/working-with-indexeddb
- https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB
下面的代码段将转储来自 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();
};
};
Running the code above from DevTools > Sources > Snippets will also let you set breakpoints and debug and inspect the objects.
确保将正确的数据库版本设置为 indexedDB.open(...)
的第二个参数。要查看浏览器使用的值,可以使用以下代码:
indexedDB.databases().then(
function(r){
console.log(r);
}
);
正在开发 Chrome 扩展,需要与 IndexedDB 集成。试图弄清楚如何使用 Dexie.JS
。找到了一堆样品。那些看起来不太复杂。在 https://github.com/dfahlander/Dexie.js/blob/master/samples/open-existing-db/dump-databases.html
但是,当我 运行 上面的 "dump utility," 它没有看到 IndexedDB 数据库时,告诉我:There are databases at the current origin.
在开发人员工具 Application
选项卡的存储下,我看到了我的 IndexedDB
数据库。
这是某种权限问题吗?任何 tab/user 都可以访问任何 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);
})();
使用当前 indexedDB API 将数据转储到 JSON 文件的工作示例,如以下所述:
- https://developers.google.com/web/ilt/pwa/working-with-indexeddb
- https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB
下面的代码段将转储来自 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();
};
};
Running the code above from DevTools > Sources > Snippets will also let you set breakpoints and debug and inspect the objects.
确保将正确的数据库版本设置为 indexedDB.open(...)
的第二个参数。要查看浏览器使用的值,可以使用以下代码:
indexedDB.databases().then(
function(r){
console.log(r);
}
);