65.9K
CodeProject 正在变化。 阅读更多。
Home

UWP 存储包装器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (2投票s)

2018年12月26日

CPOL

2分钟阅读

viewsIcon

8578

downloadIcon

107

UWP 存储包装器

引言

UWP 存储是 UWP 应用的持久化名称-值存储 API。本文展示了一个用 C++/CX 编写的封装器,使其更易于在 C++/CX 中使用。虽然使用 C# 已经很简单,不需要这个封装器,但仍然展示了有和没有封装器的比较。

C++/CX 写入和读取原始值

在这个 C++/CX 示例中,代码展示了如何直接使用 UWP 存储来存储和读取整数。

Windows::Storage::ApplicationDataContainer^ localSettings =
    Windows::Storage::ApplicationData::Current->LocalSettings;

localSettings->Values->Insert("RawKey", 123);
bool exists = localSettings->Values->HasKey("RawKey");
if (exists)
{
    Platform::Object^ obj = localSettings->Values->Lookup("RawKey");
    int result = safe_cast<int>(obj);
}
localSettings->Values->Clear();

在这个第二个 C++/CX 示例中,代码展示了如何使用带有封装器的 UWP 存储来存储和读取整数。代码更简洁。GetInt32 的第二个参数指示名称是否存在于存储中。如果不存在,则第三个参数将作为默认首选值返回。

UWPStorage^ storage = ref new UWPStorage(StorageType::Local);
storage->SetInt32("WrapperKey", 456);
bool exists = false;
int result = storage->GetInt32("WrapperKey", &exists, 444);
storage->Clear();

C# 写入和读取原始值

这个 C# 示例展示了如何直接使用 UWP 存储来存储和读取整数。

Windows.Storage.ApplicationDataContainer localSettings =
    Windows.Storage.ApplicationData.Current.LocalSettings;

localSettings.Values["RawKey"] = 123;
int result = (int)(localSettings.Values["RawKey"]);
localSettings.Values.Clear();

这个 C# 示例展示了如何直接使用 UWP 存储来存储和读取整数。 同样,GetInt32out 参数指示名称是否存在,否则将返回第三个参数。代码没有更简洁。因此,在 C# 中使用封装器没有优势,除非封装器可以为您捕获将类型转换为原始类型失败时的异常,而您需要手动 try-catch。

UWPStorage storage = new UWPStorage(StorageType.Local);
storage.SetInt32("WrapperKey", 456);
bool exists = false;
int result = storage.GetInt32("WrapperKey", out exists, 444);
storage.Clear();

C++/CX 写入和读取原始复合值

复合值是一组名称-值设置。C++/CX 代码直接存储和读取一个包含 2 个名称-值的复合值。一个是整数,另一个是 string。 稍后,该复合值被删除。

Windows::Storage::ApplicationDataContainer^ localSettings =
    Windows::Storage::ApplicationData::Current->LocalSettings;

// Create a composite setting
ApplicationDataCompositeValue^ composite = 
    ref new ApplicationDataCompositeValue();
composite->Insert("intVal", dynamic_cast<PropertyValue^>
    (PropertyValue::CreateInt32(1212)));
composite->Insert("strVal", dynamic_cast<PropertyValue^>
    (PropertyValue::CreateString("string")));

auto values = localSettings->Values;
values->Insert("RawCompositeSetting", composite);

// Read data from a composite setting
ApplicationDataCompositeValue^ composite2 = 
    safe_cast<ApplicationDataCompositeValue^>
    (localSettings->Values->Lookup("RawCompositeSetting"));

if (composite2)
{
    // Access data in composite2["intVal"] and composite2["strVal"]
    int one = safe_cast<IPropertyValue^>
        (composite2->Lookup("intVal"))->GetInt32();
    String^ hello = safe_cast<String^>
        (composite2->Lookup("strVal"));
}
// Delete a composite setting
values->Remove("RawCompositeSetting");

使用 UWP 存储封装器存储和读取包含 2 个名称-值的复合值的等效 C++/CX 代码。一个是整数,另一个是 string。 如您所见,代码更简洁,节省了许多键入。

UWPStorage^ storage = ref new UWPStorage(StorageType::Local);
// Create a composite setting
CompositeValue^ composite = ref new CompositeValue();
composite->SetInt32("intVal", 3434);
composite->SetString("strVal", "string");

storage->SetComposite("WrapperCompositeSetting", composite);

// Read data from a composite setting
bool exists = false;
CompositeValue^ composite2 = storage->GetComposite
    ("WrapperCompositeSetting", &exists);
if (exists)
{
    // Access data in composite2["intVal"] and composite2["strVal"]
    int one = composite2->GetInt32("intVal", &exists, 4444);
    String^ hello = composite2->GetString("strVal", &exists, "error");
}
// Delete a composite setting
storage->Remove("WrapperCompositeSetting");

C# 写入和读取原始复合值

C# 代码直接存储和读取一个包含 2 个名称-值的复合值。一个是整数,另一个是 string。 稍后,该复合值被删除。

Windows.Storage.ApplicationDataContainer localSettings = 
    Windows.Storage.ApplicationData.Current.LocalSettings;

// Create a composite setting
Windows.Storage.ApplicationDataCompositeValue composite = 
    new Windows.Storage.ApplicationDataCompositeValue();
composite["intVal"] = 1212;
composite["strVal"] = "string";

localSettings.Values["RawCompositeSetting"] = composite;

// Read data from a composite setting
Windows.Storage.ApplicationDataCompositeValue composite2 =
    (Windows.Storage.ApplicationDataCompositeValue)
    localSettings.Values["RawCompositeSetting"];

if (composite2!=null)
{
    // Access data in composite2["intVal"] and composite2["strVal"]
    int one = (int)(composite2["intVal"]);
    string hello = composite2["strVal"].ToString();
}

// Delete a composite setting
localSettings.Values.Remove("RawCompositeSetting");

依赖封装器存储和读取包含 2 个名称-值的复合值的等效 C# 代码。一个是整数,另一个是 string。 代码同样简洁。

UWPStorage storage = new UWPStorage(StorageType.Local);
// Create a composite setting
CompositeValue composite = new CompositeValue();
composite.SetInt32("intVal", 3434);
composite.SetString("strVal", "string");

storage.SetComposite("WrapperCompositeSetting", composite);

// Read data from a composite setting
bool exists = false;
CompositeValue composite2 = storage.GetComposite
    ("WrapperCompositeSetting", out exists);
if (exists)
{
    // Access data in composite2["intVal"] and composite2["strVal"]
    int one = composite2.GetInt32("intVal", out exists, 4444);
    string hello = composite2.GetString("strVal", out exists, "error");
}
// Delete a composite setting
storage.Remove("WrapperCompositeSetting");

有了这个库,现在就可以编写一个具有相同接口的可移植 C++ 存储类,它不仅可以在 UWP 上工作,还可以在其他操作系统(如 Linux 和 MacOSX)上工作,从而减少了将 UWP 应用移植到其他平台的所需工作量(如果需要)。

代码托管在 Github 上。

© . All rights reserved.