我有一个应用程序最近开始随机丢失indexeddb项目。 “丢失”是指确认它们已被保存,但几天后不再存在。
我的假设是,由于磁盘已满,Chrome正在丢弃indexeddb项。
我的问题特别是,是否有我的应用程序可以监听的任何事件,或者我可以参考的任何Chrome日志条目,以确认是这种情况。注意我不是要解决问题,而是要寻找可以检测到问题的方法。
每个应用程序都可以查询存储了多少数据或更多数据通过调用queryUsageAndQuota()方法可为应用程序提供空间配额API。See
您可以使用定期BackgroundSync估计分配给临时用途的已用空间和可用空间using:
// index.html
navigator.serviceWorker.ready.then(registration => {
registration.periodicSync.register('estimate-storage', {
// Minimum interval at which the sync may fire.
minInterval: 24 * 60 * 60 * 1000,
});
});
// service_worker.js
self.addEventListener('periodicsync', event => {
if (event.tag == 'estimate-storage') {
event.waitUntil(estimateAndNotify());
}
});
To estimate use the method: navigator.storage.estimate()//returns a Promise which resolves with {usage, quota} values in bytes.
超过临时存储配额时,所有数据(包括存储最旧使用的AppCache,IndexedDB,WebSQL,文件系统API)原点被删除。
您可以切换到无限制存储或永久存储。
不确定在现实生活中将如何工作
此功能最初仍处于试验阶段。
但是在这里https://developers.google.com/web/updates/2016/06/persistent-storage,您可以找到
这仍在开发中,目标是使用户在清除数据之前了解“持久”数据,您可以假设“持久”意味着没有数据就不会清除您的数据。用户明确通知,并直接控制该删除。
谁可以在您正在寻找方法的评论中回答您的澄清
用户或我的应用如何知道这是正在发生的事情
所以,不知道您的应用程序,但是用户也许会收到通知。至少页面是2016年。现在必须已完成某些操作。
您可以参考有关MDN的Browser storage limits and eviction criteria文章。
我的假设是,由于磁盘已满,Chrome正在丢弃indexeddb项目
根据本文,您的假设似乎是正确的。
现在,确认此问题的一种方法可能是保存已在持久性存储中确认的项目的唯一ID-(与实际数据相比,其大小很小),并定期比较indexeddb中是否有所有项目。
您可能还想参考best practices。最后这条评论
我认为您需要IndexedDB Observer。如果我明白了您的意思,这些链接可能会对您有所帮助。 Link-01-Link-02
可能会有所帮助。