【问题标题】:Xamarin Forms: Is it possible to save and retrieve an EpubBook data using SettingsPlugin?Xamarin Forms:是否可以使用 SettingsPlugin 保存和检索 EpubBook 数据?
【发布时间】:2020-07-29 16:50:29
【问题描述】:

我正在使用SettingsPlugin 将值保存到本地数据库。使用这个插件,我保存了一个 EpubBook 数据,如下所示:

CrossSettings.Current.AddOrUpdateValue("epub", epubBook.ToString());

检索到如下值:

string epubString = CrossSettings.Current.GetValueOrDefault("epub", string.Empty);
if (!string.IsNullOrWhiteSpace(epubString))
{
    //Need to convert string epub data to EpubBook data
}

我需要将字符串 epub 数据转换为 EpubBook 吗?这可能吗?这是为了缓存 EpubBook 数据。

我使用Application.Current.Properties 完成了相同的操作,并且在那里保存和检索工作正常。请看以下代码:

//Saving value
Application.Current.Properties["epub"] = epubBook;
//Retriving value
EpubBook epubBook = (EpubBook)Application.Current.Properties["epub"];

Application.Current.Properties 值会在关闭应用程序后自动清除。这就是我开始研究SettingsPlugin 的原因。那么有什么方法可以使用SettingsPlugin 保存和检索 EpubBook 吗?如果没有建议缓存 EpubBook 数据的方法?

【问题讨论】:

  • 为什么?为什么不直接将其写入文件系统?一个 epub 可以很容易地从数百 KB 到数百 MB。为什么要尝试使用设置来保存它们?
  • @Jason 目前我的 epub 是一个 URL,我总是从 URL 解析 epub 章节。首先,将 URL 转换为流,然后转换为 epubbook。这种方法太慢了,请提出解决方案?
  • 这仍然无法解释您为什么不直接将数据写入文件系统

标签: xamarin.forms epub


【解决方案1】:

来自我的XF thread的回答。

尝试使用http客户端请求数据,这样我们就可以直接获取字节:

bool hasKey = Preferences.ContainsKey("epub");
if (hasKey)
{
    string fileName = Preferences.Get("epub", string.Empty);
    var folderPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
    var filePath = Path.Combine(folderPath, fileName);
    var bytes = File.ReadAllBytes(filePath);
    // convert
    var stream1 = new MemoryStream(bytes);
    epubBook = EpubReader.ReadBook(stream1);
}
else
{
    Stream stream;
    //HttpWebRequest request = (HttpWebRequest)WebRequest.Create(fileUrl);
    //HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    HttpClient client = new HttpClient();
    var response = await client.GetAsync(fileUrl);

    //stream = response.GetResponseStream();
    stream = await response.Content.ReadAsStreamAsync();
    epubBook = EpubReader.ReadBook(stream);

    //saving to folder
    byte[] bytes = await response.Content.ReadAsByteArrayAsync();
    string filename = Path.GetFileName(fileUrl);
    var folderPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
    var filePath = Path.Combine(folderPath, filename);
    File.WriteAllBytes(filePath, bytes);
    Preferences.Set("epub", filename);           
}

我们需要在Android上添加明文:

<application android:label="EPubDemo.Android" android:usesCleartextTraffic="true"></application>

并在 iOS ss 中禁用 ATS 这个请求是 http。

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2019-09-29
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多