javascript - 德克西JS : very large IndexedDB but empty tables

标签 javascript indexeddb dexie

我有一个应用程序,它使用普通的 javascript 来显示 openlayers map ,人们点击一个位置并可以添加图片。我使用 Dexie JS 在页面之间存储数据,直到用户准备好发送所有内容。全部上传后,记录将被删除。

但 Edge 和 Chrome 在桌面和移动设备上不断崩溃。这似乎与 IndexedDB 太大有关。

有一个“主”记录保存详细信息,还有一个“相关”表保存图像。

要添加记录,这是我的代码:

export const AddRecord = async (tablename, data) => {
let table = db.table(tablename);
let added = await table.add(data);
return added;
}

要删除记录,这是我的代码:

export const DeleteRecord = async (tablename, id) => {
let table = db.table(tablename);
let deleted = await table.delete(id);
return deleted;
}

但这并不是真正的问题。一切都被执行,上传后,记录被删除。但indexeddb一直占用空间

我清除了所有数据并从此开始

screenshot before

我添加了 1 条记录,其中包含一个 ID 和三个字段

screenshot one record

存储空间已经增加了 3MB,这对于一条记录来说似乎已经很大了。但这并不重要,因为无论如何所有内容都会被删除

screenshot storage with one record

但是上传 25 张图像(大小在 1.5MB 到 2.5MB 之间)后,我得到了这个结果

screenshot after

我用来存储数据的表是空的。是什么占用了空间?我需要“清除”才能完全删除所有剩余数据吗?

最佳答案

您所描述的内容似乎与大型 ArrayBuffer 被索引时发生的情况类似 - 请参阅 https://dexie.org/docs/Version/Version.stores()#warning

根据您的描述,我不明白您如何对表进行索引,但如果是这种情况,解决方案是不要索引大型 ArrayBuffers 或 Uint8Arrays 等。仅索引您要在 where 中使用的字段查询 - 可以添加其他属性而无需建立索引。

例如,假设您已像这样声明了您的 Dexie:

const db = new Dexie('myDB');
db.version(1).stores({
  imageEntries: '++id,image'
});

然后,如果您按如下方式添加图像:

const img = new UInt8Array(size);
db.imageEntries.add({image: img});

...那么这将使数据库必须为“图像”索引以及图像数据创建大量数据。

对相关表建立索引的正确方法更像是:

const db = new Dexie('myDB');
db.version(2).stores({
  imageEntries: '++id' // Only the primary key here.
});

请记住,dexie 不会强制您列出 version().stores() 中的所有属性,而只是列出您需要查询的属性。

关于javascript - 德克西JS : very large IndexedDB but empty tables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76686618/

相关文章:

javascript - 确定 GC 释放了哪些 JavaScript 对象

javascript - 如何动态合并两个 JavaScript 对象的属性?

ios - indexedDB 在 iOS 上表现不佳?

javascript - javascript-处理 'UnknownError'

angular - Dexie - 检查记录是否存在,如果不存在则初始化它

javascript - NodeJS arr.splice() 未从数组中删除

Javascript - 生成相同颜色的不同阴影

google-chrome - 如何从 chrome 扩展访问 IndexedDB(当前打开的域/选项卡)

javascript - 如何将现有 Dexie 数据库迁移到新的 Dexie 数据库或如何重命名 Dexie 数据库?

javascript - React - 显示隐藏两个元素而不在页面加载时闪烁