比较存储选项

已完成

.NET Multi-platform App UI (MAUI) 提供了多个存储选项,用于在设备上本地缓存数据,具体取决于数据的性质、结构和大小。 用于在 .NET MAUI 应用中本地存储数据的三个最常用选项包括:

  • 首选项:以键-值对的形式存储数据
  • 文件系统:通过文件系统访问直接在设备上存储松散文件
  • 数据库:在关系数据库中存储数据

适用于 .NET MAUI 应用的常见本地存储选项示意图。

在本单元中,我们将了解这些存储选项以及每个选项最适合的情况。

何时使用首选项

使用“首选项”可方便地处理简单的数据片段(如用户选择)。 它们通常用于使用户能够配置应用程序。 将此数据存储为一组键/值对。 例如,假设你希望用户能够指定应用是否应在会话之间保存其用户名和密码。 可以将用户的选择存储在“首选项”中。

以下代码演示如何将 saveLoginDetails 变量中记录的布尔值存储为名为 SaveLogin 的首选项,然后将此数据读回。 请注意,如果找不到指定的首选项,Get 方法需要提供默认值:

bool saveLoginDetails = ...;
...
Preferences.Set("SaveLogin", saveLoginDetails);
...
var savedPreference = Preferences.Get("SaveLogin", false);

Preferences 类还包含用于确定命名首选项是否存在 (ContainsKey)、删除首选项 (Remove) 以及删除所有首选项数据 (Clear) 的方法。

注意

应仅将简单数据类型存储为首选项。 不能存储对大型对象(如列表、集合和数组)的引用。 对于此类型的数据,请使用文件系统或数据库。

何时使用文件系统

移动和桌面设备有一个文件系统,它包含由文件夹和文件构成的分层目录结构。 拥有 XML、二进制文件或文本文件等松散文件时,使用文件系统会很方便。 例如,假设想要在设备上本地存储日志数据。 可创建一个文本文件,将此文件保存到文件系统,并在事件发生时将日志写入其中。 如果需要在应用关闭时保存,还可以将大型数据结构序列化为文件,并在本地将其缓存到文件系统中。 当应用重新启动时,可以将此数据重新读回内存中。 以下代码展示了将数据序列化为文件并保存此文件,然后读回数据并在以后反序列化回内存的示例。 在此处,我们将 JSON 用于序列化格式,但你可以将数据保存为你认为最适合数据的性质和应用的安全要求的任何格式。

using System.Text.Json;
using System.IO;

// Data to be written to the file system, and read back later
List<Customer> customers = ...;

// Serialize and save
string fileName = ...;
var serializedData = JsonSerializer.Serialize(customers);
File.WriteAllText(fileName, serializedData);
...

// Read and deserialize
var rawData = File.ReadAllText(fileName);
customers = JsonSerializer.Deserialize<List<Customer>>(rawData);

访问应用沙盒

处理 XML 文件等松散文件时,需要将它们存储在文件系统中的合适位置。 其中一些数据可能很敏感,并且你不希望将其保存到其他应用或用户可以轻松访问的位置。 .NET MAUI 应用提供应用沙盒。 应用沙盒是应用程序可以使用的专用区域。 在默认情况下,除操作系统外,其他任何应用程序都无法访问此区域。 可以使用 FileSystem 类的 AppDataDirectory 静态属性访问沙盒:

string path = FileSystem.AppDataDirectory;

在此代码中,path 变量包含指向位置的文件路径,可在该位置存储应用程序要使用的文件。 可以使用“何时使用文件系统”部分中所示的技术读取数据并将其写入此文件夹中的文件。

注意

FileSystem.AppDataDirectory 属性是特定于设备的路径的抽象;它的计算结果为 Android、iOS 和 WinUI3 上的不同文件夹。 通过此抽象,可以编写用于以独立于运行沙盒的平台的方式引用沙盒的代码。 使用此抽象而不是在代码中显式引用特定于设备的路径。

有关在 iOS 应用中保存数据的指南

Apple 提供关于文件存储位置的 iOS 指南。 有两个主文件夹位置:

  • Library 文件夹:如前所述,FileSystem.AppDataDirectory 属性返回此文件夹。 存储应用生成的数据时,使用 Library 文件夹。

  • Documents 文件夹:以下代码段演示如何在 docFolder 变量中引用此文件夹。 仅将 Documents 文件夹用于存储用户生成的数据。 此数据是直接响应用户操作而创建的。 例如,如果要创建 Microsoft Word 等文本编辑应用程序,则将文档存储在 Documents 文件夹中。

    string docFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
    

何时使用数据库

如果拥有数据关系或想要随时间推移筛选数据,使用本地数据库是个不错的想法。 例如,在社交媒体场景中,每个帖子都包含与帖子相关的数据,例如时间戳和内容。 然而,每个帖子也与发布该帖子的用户有关系。 最好在数据库中表示这种关系,以防止帖子之间的数据重复,同时可提高搜索数据的效率。

SQLite 数据库是一个文件,你需要将其存储在适当的位置。 理想情况下,应在沙盒中的 AppDataDirectory 文件夹下创建一个文件夹,并在此文件夹中创建数据库。