Win8应用数据存储
说到数据存储,大家可能会马上想到的是数据库和文件。数据库对于数据管理很方便,但是如果是开发小应用可能就没必要用数据库来存储了,这时候可以选择用文件。文件存储的优点是占用硬盘空间小,不像数据库那样要在硬盘上搭设一个存储系统来。win8开发过程中,数据库通常存在系统C盘的一个专门存应用程序数据的文件夹中。首先添加命名空间using Windows.Storage;
StorageFolder folder = await ApplicationData.Current.LocalFolder;
获取该文件夹(隐藏的),要想知道文件夹路径,可以在输出folder.Path查看,或者更简单地通过设断点,鼠标移到变量上方查看Path信息。
得到文件夹之后可以通过它的函数进行一系列操作,如获取文件GetFileAsync("Plan.xml");
XML文件读写
文件存储中我觉得比较好用的是xml文件,因为它存储数据有层次感,数据以树状形存储,第一个节点为根节点,从上往下引发子节点。
在这要说明一下,Win8应用商店开发时用的xml类跟win7上wpf或asp.net用的xml类不一样,win7上用的是Systerm.Xml,win8应用商店开发用的是Windows.Data.Xml.Dom
xml文件生成
下面是直接生成一个xml文件,当然也可以将已存在的文件复制过来。
CreationCollisionOption.FailIfExists参数表明如果创建的时候已存在相同名字的文件就返回失败。
XmlDocument xmlDo = new XmlDocument();
xmlDo.LoadXml("<?xml version='1.0' encoding='utf-8' ?> <AllPlan> </AllPlan>");//初始化xml
try
{
StorageFile xmlfile = await ApplicationData.Current.LocalFolder.CreateFileAsync("Plan.xml", CreationCollisionOption.FailIfExists);
await xmlDo.SaveToFileAsync(xmlfile);
}
catch{}
xml文件插入记录
public async void AddToPlan(string content,string date)//添加一个计划
{
// string date = time.ToString();//将日期转换为字符串
StorageFile temp = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync("Plan.xml");//第一次需要把应用程序中的xml复制到存储文件夹
StorageFolder copyfolder = ApplicationData.Current.LocalFolder;
try
{
await temp.CopyAsync(copyfolder, "Plan.xml", NameCollisionOption.FailIfExists);//复制,已存在则错误
}
catch { }
StorageFile xmlFile = await ApplicationData.Current.LocalFolder.GetFileAsync("Plan.xml");//取到xml文件
XmlDocument xmlDo = await Windows.Data.Xml.Dom.XmlDocument.LoadFromFileAsync(xmlFile);//声称一个xml问价对象
XmlElement Content = xmlDo.CreateElement("Content");
Content.InnerText = content;
XmlElement Date = xmlDo.CreateElement("Date");
Date.InnerText = date;
XmlElement newNode = xmlDo.CreateElement("Plan");
newNode.AppendChild(Content);
newNode.AppendChild(Date);
IXmlNode addNode = xmlDo.SelectSingleNode("/AllPlan");
addNode.AppendChild(newNode);
await xmlDo.SaveToFileAsync(xmlFile);
}
xml文件删除记录
删除记录的时候要点是先得到要删除的节点的父节点root(如下),再获取这个节点的所有子节点列表(下面的nodelist),从中找到目标,通过root.RemoveChild删除
async private void DeleteTheSelectedItem(object sender, RoutedEventArgs e)
{//删除选中项
if (ListViewIndex == -1)
{
MessageDialog mess = new MessageDialog("请先选择要删除的计划!");
await mess.ShowAsync();
}
else
{
MessageDialog ensure = new MessageDialog("确定要删除该计划吗?");
UICommand continu = new UICommand("确定删除", async (UICommandInvokedHandler) =>
{
string DeleteDate = PlanList[ListViewIndex].PlanDate.Substring(3, 10);
string DeleteContent = PlanList[ListViewIndex].PlanContent;
StorageFile xmlfile = await ApplicationData.Current.LocalFolder.GetFileAsync("Plan.xml");
XmlDocument xmlDo = await Windows.Data.Xml.Dom.XmlDocument.LoadFromFileAsync(xmlfile);
XmlNodeList nodelist = xmlDo.SelectNodes("/AllPlan/Plan");
IXmlNode root = xmlDo.SelectSingleNode("/AllPlan");
// XmlNodeList nodelist = root.ChildNodes;
for (int i = 0; i < nodelist.Length; i++)
{
if (nodelist[i].FirstChild.InnerText == DeleteContent && nodelist[i].LastChild.InnerText == DeleteDate)
{
root.RemoveChild(nodelist[i]);
await xmlDo.SaveToFileAsync(xmlfile);
break;
}
}
await ShowPlan();
}
);
ensure.Commands.Add(continu);
UICommand cancel = new UICommand("取消", (UICommandInvokedHandler) =>
{
;
}
);
ensure.Commands.Add(cancel);
await ensure.ShowAsync();
}//else
}
跟Systerm.Xml不一样的是,XmlDocument没有Load(string file)函数,也没办法设置Declaration(xml文件头声明)。使用xml文件存储要注意的是每次更改之后都需要Save。