|
metro 应用程序的数据有三种存储方式
第一种是打开一个FileSavePicker 让用户选择存储的位置
第二种是可以获取当前metro程序安装包的路径 然后保存在安装路径下的位置
// Package.Current.InstalledLocation.CreateFileAsync(...
// Package.Current.InstalledLocation.GetFileAsync(...
第三种是 Provides access to the application data store.
//Windows.Storage.ApplicationData.Current
在这里我先介绍如何把数据存储在 application data store
首先介绍一个工具类 ObjectStorageHelper (Generic Object Storage Helper for WinRT)
源码如下:
public enum StorageType
{
Roaming, Local, Temporary
}
public class ObjectStorageHelper
{
private ApplicationData appData = Windows.Storage.ApplicationData.Current;
private XmlSerializer serializer;
private StorageType storageType;
private string FileName(T Obj)
{
return String.Format("{0}.xml", Obj.GetType().FullName);
}
public ObjectStorageHelper(StorageType StorageType)
{
serializer = new XmlSerializer(typeof(T));
storageType = StorageType;
}
public async void DeleteAsync()
{
try
{
StorageFolder folder = GetFolder(storageType);
var file = await GetFileIfExistsAsync(folder, FileName(Activator.CreateInstance()));
if (file != null)
{
await file.DeleteAsync(StorageDeleteOption.PermanentDelete);
}
}
catch (Exception)
{
throw;
}
}
public async void SaveAsync(T Obj)
{
try
{
if (Obj != null)
{
StorageFile file = null;
StorageFolder folder = GetFolder(storageType);
file = await folder.CreateFileAsync(FileName(Obj), CreationCollisionOption.ReplaceExisting);
IRandomAccessStream writeStream = await file.OpenAsync(FileAccessMode.ReadWrite);
Stream outStream = Task.Run(() => writeStream.AsStreamForWrite()).Result;
serializer.Serialize(outStream, Obj);
}
}
catch (Exception)
{
throw;
}
}
public async Task LoadAsync()
{
try
{
StorageFile file = null;
StorageFolder folder = GetFolder(storageType);
file = await folder.GetFileAsync(FileName(Activator.CreateInstance()));
IRandomAccessStream readStream = await file.OpenAsync(FileAccessMode.Read);
Stream inStream = Task.Run(() => readStream.AsStreamForRead()).Result;
return (T)serializer.Deserialize(inStream);
}
catch (FileNotFoundException)
{
//file not existing is perfectly valid so simply return the default
return default(T);
//Interesting thread here: How to detect if a file exists (http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/1eb71a80-c59c-4146-aeb6-fefd69f4b4bb)
//throw;
}
catch (Exception)
{
//Unable to load contents of file
throw;
}
}
private StorageFolder GetFolder(StorageType storageType)
{
StorageFolder folder;
switch (storageType)
{
case StorageType.Roaming:
folder = appData.RoamingFolder;
break;
case StorageType.Local:
folder = appData.LocalFolder;
break;
case StorageType.Temporary:
folder = appData.TemporaryFolder;
break;
default:
throw new Exception(String.Format("Unknown StorageType: {0}", storageType));
}
return folder;
}
private async Task GetFileIfExistsAsync(StorageFolder folder, string fileName)
{
try
{
return await folder.GetFileAsync(fileName);
}
catch
{
return null;
}
}
}
用法:
public class Customer
{
public string CustomerID { get; set; }
public string CustomerName { get; set; }
public string Address { get; set; }
}
//保存数据
private void btnSave_Click(object sender, RoutedEventArgs e)
{
var customerList = new List {
new Customer{ CustomerID="1",CustomerName="John",Address="Benjing"},
new Customer{ CustomerID="2",CustomerName="Lily",Address="Shanghai"},
new Customer{ CustomerID="3",CustomerName="Smith",Address="Guangzhou"},
new Customer{ CustomerID="4",CustomerName="Tom",Address="Shenzhen"}
};
var objectStorageHelper = new ObjectStorageHelper(StorageType.Local);
objectStorageHelper.SaveAsync(customerList);
}
//保存数据
private void btnSave_Click(object sender, RoutedEventArgs e)
{
var customerList = new List {
new Customer{ CustomerID="1",CustomerName="John",Address="Benjing"},
new Customer{ CustomerID="2",CustomerName="Lily",Address="Shanghai"},
new Customer{ CustomerID="3",CustomerName="Smith",Address="Guangzhou"},
new Customer{ CustomerID="4",CustomerName="Tom",Address="Shenzhen"}
};
var objectStorageHelper = new ObjectStorageHelper(StorageType.Local);
objectStorageHelper.SaveAsync(customerList);
}
//获取数据
async private void btnShow_Click(object sender, RoutedEventArgs e)
{
var objectStorageHelper = new ObjectStorageHelper(StorageType.Local);
//Get the object from the storage folder
List customerList = await objectStorageHelper.LoadAsync();
}
最后查看数据:
|
|