使用 Dexie 的本地存储无法保持持久性

LFd*_*FdC 6 javascript persistent-storage local-storage dexie

我正在使用 Dexie 访问闪存卡制造商项目上的 IndexedDB。我可以按预期操作数据库,如果我关闭并重新打开浏览器,它会保留在数据库中,但通常当我在几天没有处理该项目后打开该项目时,我放入数据库中的存储数据是“不再有了。

我做了一些研究,发现我需要使数据库持久化,但我不知道如何做到这一点。

我几乎已将 Dexie Storage Manager 页面中的推荐代码复制到主页 index.js 的 onLoad 函数中。这是相关代码:

//When the page loads, display the decks in ul on the webpage.
window.addEventListener('load', onLoad);
async function onLoad() {
   
   //Check how much data is available.
   showEstimatedQuota();
 
   //Make sure the storage is persistent.
   isStoragePersisted().then(async isPersisted => {
     if (isPersisted) {
       console.log(":) Storage is successfully persisted.");
     } else {
       console.log(":( Storage is not persisted.");
       console.log("Trying to persist..:");
       if (await persist()) {
         console.log(":) We successfully turned the storage to be persisted.");
       } else {
         console.log(":( Failed to make storage persisted");
       }
     }
   });
}
Run Code Online (Sandbox Code Playgroud)

上面的 onLoad 函数引用了我保存在 dexie-setup.js 上的三个函数:

//This function makes the storage persistent.
//(Copied from https://dexie.org/docs/StorageManager)
async function persist() {
  return await navigator.storage && navigator.storage.persist &&
    navigator.storage.persist();
}


//This function checks if the storage is persistent.
//(Copied from https://dexie.org/docs/StorageManager)
 async function isStoragePersisted() {
  return await navigator.storage && navigator.storage.persisted &&
    navigator.storage.persisted();
}


//This function logs to console how much data is available.
//(Copied from https://dexie.org/docs/StorageManager)
async function showEstimatedQuota() {
  if (navigator.storage && navigator.storage.estimate) {
    const estimation = await navigator.storage.estimate();
    console.log(`Quota: ${estimation.quota}`);
    console.log(`Usage: ${estimation.usage}`);
  } else {
    console.error("StorageManager not found");
  }
}
Run Code Online (Sandbox Code Playgroud)

我的控制台日志:

  • dexie-setup.js:56 配额: 6358499328

  • dexie-setup.js:57 使用情况: 25370

  • index.js:30 :( 存储未持久化。

  • index.js:31 试图坚持..:

  • dexie-setup.js:84 完成检查 dexie。

  • index.js:33 :) 我们成功地将存储转变为持久化。

但是,如果刷新页面,控制台上会记录相同的内容:数据库仍设置为非持久性。

showEstimatedQuota 函数检查数据存储并确认 DataStorage API 正在运行,所以我认为这不是问题。(我只存储带有文本的小对象,所以无论如何我不希望超出存储限制。)

到目前为止,该项目完全在我的 chromebook 上本地化,我正在 Chrome 浏览器上查看它。

请让我知道如何使我的数据库持久化。我对此很陌生(这是我在 stackoverflow 上的第一个问题!),所以希望这是一个容易解决的问题!提前致谢。

小智 0

引用 Dexie 的文档:“尽管 IndexedDB 是一个功能齐全的 Web 客户端数据库,但默认情况下它不是持久存储。没有 StorageManager 的 IndexedDB 只是一个 \xe2\x80\x9cbest-effort\xe2\x80\ x9d 数据库可以在设备磁盘空间不足的情况下删除。浏览器可能会在不通知用户的情况下删除您的数据库,以防需要为其他网站\xe2\x80\x99s 最近使用的数据释放空间你的。”

\n

因此,您无法使数据库持久化。只需制作一个 \xe2\x80\x9cbest-effort\xe2\x80\x9d。\n此链接可能会有所帮助:

\n
    \n
  1. https://web.dev/persistent-storage/
  2. \n
  3. Chrome.Storage.本地持久性
  4. \n
\n

希望对您有所帮助。

\n