Win8应用开发数据存储及xml文件读写

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值