UWP 存储包装器






4.33/5 (2投票s)
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 存储来存储和读取整数。 同样,GetInt32
的 out
参数指示名称是否存在,否则将返回第三个参数。代码没有更简洁。因此,在 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 上。