Dexie JS:非常大的IndexedDB,但表空

4urapxun  于 2023-08-01  发布在  IndexedDB
关注(0)|答案(1)|浏览(201)

我有一个应用程序,它使用vanilla JavaScript来显示openlayersMap,人们点击一个位置就可以添加图片。我使用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不断占用空间
我清除了所有数据,从这个开始


的数据
我添加了一条包含id和三个字段的记录



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



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



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

sbdsn5lh

sbdsn5lh1#

您描述的内容似乎与索引大型ArrayBuffer时发生的情况类似-请参阅https://dexie.org/docs/Version/Version.stores()#warning
根据你的描述,我看不出你是如何索引表的,但如果是这种情况,解决方案是不要索引大型ArrayBuffers或Uint 8Arrays等。只索引您要在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()中的所有属性,而只列出您需要查询的属性。

相关问题