簡體   English   中英

如何在 Blazor WASM 中讀取/導入一個 Sqlite 數據庫?

[英]How to read/import a Sqlite database in Blazor WASM?

它甚至可行嗎? 我所能找到的只是如何讓它從應用程序內部運行,沒有任何方法可以導入文件,這將是一個byte[]文件並制作它,以便可以實例化客戶端並在其上讀/寫(在記憶中)。

這是可能的,但不是很可行,因為根據我的拙劣實驗,當你添加更多 data.tables 時,它會導致現在一些奇怪的行為/錯誤。

首先,您通過 HTTP 調用將文件讀取為 stream,並將其轉換為 base64 字符串,如下所示:

var stream = await Http.GetStreamAsync("sqlite.db"); // file in the wwwroot
var buffer = new byte[stream.Length];
using var ms = new MemoryStream(buffer, 0, buffer.Length);
await stream.CopyToAsync(ms);

string base64 = Convert.ToBase64String(ms.ToArray());
await JS!.InvokeVoidAsync("fn.writeToCache", base64);

然后,這是JavaScript function 的實現:

window.fn = {
  writeToCache: async function (buffer) {
    const cachePath = `/data/cache/sqlite.db`;
    const cache = await caches.open('your-cache-name');
    const resp = await cache.match(cachePath);

    if (resp && resp.ok) {
      return false;
    } 

    const fileUrl = "data:application/octet-stream;base64," + buffer;
    const res = await fetch(fileUrl);
    const blob = await res.blob();

    const headers = new Headers({
      'content-length': blob.size
    });

    const response = new Response(blob, {
      headers
    });

    await cache.put(cachePath, response);

    console.log("Data cached.");

    location.Reload(); // Necessary step to be able to see the cache
  }
}

只是一些額外的注意事項:

/** Available only in secure contexts. */
declare var caches: CacheStorage; // <-- HTTPS only
declare var crossOriginIsolated: boolean;
declare var crypto: Crypto;
declare var indexedDB: IDBFactory;
// ...
  • 安全上下文:此功能僅在安全上下文 (HTTPS) 中可用,在某些或所有支持的瀏覽器中可用。

  • :緩存 API 不支持 HTTP 緩存標頭。

  • 密鑰匹配密鑰匹配算法取決於值中的VARY header 因此,匹配一個新鍵需要同時查看Cache object 中條目的鍵和值。因此,請確保按名稱對緩存進行版本控制,並僅使用它們可以安全操作的腳本版本中的緩存。 這是Mozilla的一個示例,說明如何通過 vanilla JavaScript擺脫舊緩存: 刪除舊緩存

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM