locked
关于vs2015community版开发windows phone时使用本地数据库的疑问及方法请教 RRS feed

  • 问题

  • 各位好,小弟初学编程吧,主要是因为自救有些事情比较繁琐,所以想把它拿到手机上做。简单说下,我有一张excel表。里面的数据就是我要用来查表使用的,然后UI就是一个输入值,获取输入值之后,进行查表,把对应的值查询出来后,在后来简单运算然后显示在UI上。这就是我app的简单应用过程。

    首先,我查找了网上很多的教程吧,就是怎么样关联excel表,作为数据库使用。但是数据源ODBC连接后,又百度出windows phone编程不支持office的操作和ODBC的连接(奇怪,我明明已经连接了我的system DSN),ok,excel这条路我停止了。

    然后我另选了一条路,因为看到了百度里说的windows phone现在都是用独立存储了,文件格式是sdf的,外部存储不能和程序直接连接,也就是程序不能直接读取外部存储文件。我就下载了sdf viewer软件,通过把excel转换成sdf之后再在程序中对其进行操作。但是后来发现,读取连接有错误(我的所有例子都是从网上百度来的)。

    放弃了上面这种方法,我又开始了SQLite的研究,据说可以通过软件程序直接访问db数据库,并且直接存储在软件项目的目录下面。从网上download了一个例子,然后实施,没问题成功了,但db数据库并没有生成在项目文件夹中。想把excel的数据直接复制进去,却找不到了对象。于是我又download个db的viewer然后拷贝数据,但是要使用SQLite for windows phone SDK,就必须切换到ARM或是X86的CPU模式,之后问题又来了,生成的项目文件变成了EXE文件,想往device里部署的时候总是不成功。

    结果就卡在了这里。确实因为我个人的软件基础太差,所以有了上面这些各种问题。

    我想有几个问题让各位高手和老师帮忙解答一下,

    1.windows phone是使用独立存储,但是开发项目是添加已有项excel,mdb或是db文件,然后生成XAP文件之后,这时候个整体啊,为什么程序编写不能直接访问呢?如果可以,具体怎么操作,如果不方便说,请给个教程,我去学习下!

    2.vs2015 windows phone开发环境中有数据服务器和数据源,这两个应该是在程序中可以直接关联使用的吧?具体怎么用呢?或是教程?

    3.为什么我在Silverlight模板中生成的项目就是xap文件呢?而这次是exe呢?怎么不能部署到我的手机里呢?

    4.对于开发一个需要外界输入信息来扩充数据库的项目,我觉得使用独立存储之后可以慢慢录入数据,使软件使用更完善。但是对于我想做的纯粹是查询的项目来说,就需要一个已经有数据的数据库来直接引入项目中直接使用,这要怎么入手来做呢?

    5.感谢大家,如果你能看完我的所有内容。

    感谢能回复我的人!谢谢!

    2015年11月16日 11:22

答案

  • 你好,通过你的问题,了解到你还有些基础知识没有掌握,我建议先搞明白以下几点:

    1、讲清楚你是在开发WP8还是WP8.1 Silverlight还是WP8.1 RT还是Win10的UWP,不同版本的SDK使用数据库也有所区别,比如WP8是可以使用SQLCE的,但Win10已经不支持了,可以使用SQLite。如果使用SQLite,可以参考我以前写的一篇博客:

    http://www.cnblogs.com/yanxiaodi/p/4941312.html

    2、你的需求貌似是需要在项目中查询一张已存在的表,你的格式是Excel,如果数据量不多,可以将其转换成XML进行读取,如果不懂XML,就需要去了解XML文件的格式,如果你只是说自己根本不了解,那怎么能应用呢?这里提供一个WP7里读取XML文件的例子,但在WP8以后的版本里肯定无法直接运行,仅供参考:

    第一种方式:

    //XDocument xdoc = XDocument.Load("AllLevels.xml");
                    //设置成Resource属性时 用Load方法读取Stream
                    //Stream stream = App.GetResourceStream(new Uri("HRD;component/AllLevels.xml", UriKind.Relative)).Stream;
                    //XDocument xdoc = XDocument.Load(stream);
                    //设置成Resource属性时 用Load方法读取uri
                    Uri uri = new Uri("/HRD;component/AllLevels.xml", UriKind.Relative);
                    XDocument xdoc = XDocument.Load(uri.ToString());
                    //初始化List
                    listLevels = new List<Level>();
                    //循环添加Level
                    foreach (XElement element in xdoc.Element("Levels").Descendants("Level"))
                    {
                        Level level = new Level();
                        level.LevelID = int.Parse(element.Element("LevelID").Value);
                        level.Content = element.Element("Content").Value;
                        level.Difficulty = int.Parse(element.Element("Difficulty").Value);
                        //level.Difficulty = 0;
                        level.LevelName = element.Element("LevelName").Value;
                        level.MinSteps = int.Parse(element.Element("MinSteps").Value);
                        level.rcnt = int.Parse(element.Element("rcnt").Value);
                        level.UserID = int.Parse(element.Element("UserID").Value);
                        level.UserName = element.Element("UserName").Value;
                        listLevels.Add(level);
                    }

    第二种方式:

    //var student = from query in xdoc.Descendants("Level")
                    //              select new Level
                    //              {
                    //                  LevelID = int.Parse(query.Element("LevelID").ToString()),
                    //                  Content = query.Element("Content").ToString(),
                    //                  Difficulty = int.Parse(query.Element("Difficulty").ToString()),
                    //                  MinSteps = int.Parse(query.Element("MinSteps").ToString()),
                    //                  rcnt = int.Parse(query.Element("rcnt").ToString()),
                    //                  UserID = int.Parse(query.Element("UserID").ToString()),
                    //                  UserName = query.Element("UserName").ToString()
                    //              };
                    //listLevels = student.ToList<Level>();


    第三种方式:

    //Uri uri = new Uri("MyResource/MyPeople.xml", UriKind.Relative);
                    //StreamResourceInfo sri = Application.GetResourceStream(uri);
                    //if (sri != null)
                    //{
                    //    XmlSerializer serializer = new XmlSerializer(typeof(List<Person>));
                    //    List<Person> data = (List<Person>)serializer.Deserialize(sri.Stream);
                    //    this.listBox.ItemsSource = data;
                    //}  
                    //Stream stream = App.GetResourceStream(new Uri("HRD;component/AllLevels.xml", UriKind.Relative)).Stream;
                    //XmlSerializer serializer = new XmlSerializer(typeof(List<Level>));
                    //listLevels = (List<Level>)serializer.Deserialize(stream);

    首先需要读取XML文件获取XDocument对象,然后去取里面的值,可以按字段读取,也可以直接反序列化成你需要的对象。

    但是因为这些代码是我从WP7的项目里拿出来的,以下这句你需要自己改下:

    Stream stream = App.GetResourceStream(new Uri("HRD;component/AllLevels.xml", UriKind.Relative)).Stream;

    改成在你的SDK版本里读取文件的方式。

    还有一种思路,如果你自己有服务器的话,可以把数据源以api的形式提供出来,手机客户端去网络查询数据。但这样还需要开发服务器端接口,貌似更复杂了一些,但好处是如果数据有变动,不需要更新客户端程序。

    至于你一会生成xap,一会生成exe,还是对各平台的SDK不熟悉导致的,WP8 Silverlight之前的SDK生成的是xap包,以后的是appx了,如果是Win10 UWP项目,部署到手机时需要编译为ARM,部署到电脑时需要编译为x86,部署到手机模拟器上也需要编译为x86。

    针对你的问题来说,如果数据量不多的话,还是转换为XMl文件最简单,查询数据使用Linq查询就行了。

    2015年11月18日 2:18

全部回复

  • 你好,

    1. 对于这个问题,你可以了解关于Winodows Phone 数据读写相关的文章,例如: Windows Phone 数据读写https://msdn.microsoft.com/zh-cn/library/bb199073.aspx

    明天会继续回复其它几个问题

    Best regards,

    HongQiang

    2015年11月17日 10:34
  • To Hong Qiang - Vendor

    先感谢下。我简单看了下,好像都是关于游戏应用开发的吧?对不起,不好意思。是这样,我的基础比较差,所以游戏的开发现在还看起来很吃力。有没有直接是windowsphone小应用或是基础的内容。谢谢!


    • 已编辑 wxxdxff 2015年11月17日 14:15 加上名字
    2015年11月17日 11:48
  • To FAE9D91C-3F07-4090-91EB-E3F70E4D0617

    你好,先感谢一下!

    之前也有请教过别人,然后告诉我用XML,但是我对XML根本不了解,所以怎么使用XML也是个问题。以上这些问题就是这一路上走过来遇到的,除了这个核心问题,其他的确实也想要能有个答案。不好意思,遇上我这小白!抱歉了!

    2015年11月17日 14:14
  • To FAE9D91C-3F07-4090-91EB-E3F70E4D0617

    基础太差了我,我是说转换之后怎么使用XML,能具体说下,或是有实例吗?谢谢!

    2015年11月17日 23:14
  • 你好,通过你的问题,了解到你还有些基础知识没有掌握,我建议先搞明白以下几点:

    1、讲清楚你是在开发WP8还是WP8.1 Silverlight还是WP8.1 RT还是Win10的UWP,不同版本的SDK使用数据库也有所区别,比如WP8是可以使用SQLCE的,但Win10已经不支持了,可以使用SQLite。如果使用SQLite,可以参考我以前写的一篇博客:

    http://www.cnblogs.com/yanxiaodi/p/4941312.html

    2、你的需求貌似是需要在项目中查询一张已存在的表,你的格式是Excel,如果数据量不多,可以将其转换成XML进行读取,如果不懂XML,就需要去了解XML文件的格式,如果你只是说自己根本不了解,那怎么能应用呢?这里提供一个WP7里读取XML文件的例子,但在WP8以后的版本里肯定无法直接运行,仅供参考:

    第一种方式:

    //XDocument xdoc = XDocument.Load("AllLevels.xml");
                    //设置成Resource属性时 用Load方法读取Stream
                    //Stream stream = App.GetResourceStream(new Uri("HRD;component/AllLevels.xml", UriKind.Relative)).Stream;
                    //XDocument xdoc = XDocument.Load(stream);
                    //设置成Resource属性时 用Load方法读取uri
                    Uri uri = new Uri("/HRD;component/AllLevels.xml", UriKind.Relative);
                    XDocument xdoc = XDocument.Load(uri.ToString());
                    //初始化List
                    listLevels = new List<Level>();
                    //循环添加Level
                    foreach (XElement element in xdoc.Element("Levels").Descendants("Level"))
                    {
                        Level level = new Level();
                        level.LevelID = int.Parse(element.Element("LevelID").Value);
                        level.Content = element.Element("Content").Value;
                        level.Difficulty = int.Parse(element.Element("Difficulty").Value);
                        //level.Difficulty = 0;
                        level.LevelName = element.Element("LevelName").Value;
                        level.MinSteps = int.Parse(element.Element("MinSteps").Value);
                        level.rcnt = int.Parse(element.Element("rcnt").Value);
                        level.UserID = int.Parse(element.Element("UserID").Value);
                        level.UserName = element.Element("UserName").Value;
                        listLevels.Add(level);
                    }

    第二种方式:

    //var student = from query in xdoc.Descendants("Level")
                    //              select new Level
                    //              {
                    //                  LevelID = int.Parse(query.Element("LevelID").ToString()),
                    //                  Content = query.Element("Content").ToString(),
                    //                  Difficulty = int.Parse(query.Element("Difficulty").ToString()),
                    //                  MinSteps = int.Parse(query.Element("MinSteps").ToString()),
                    //                  rcnt = int.Parse(query.Element("rcnt").ToString()),
                    //                  UserID = int.Parse(query.Element("UserID").ToString()),
                    //                  UserName = query.Element("UserName").ToString()
                    //              };
                    //listLevels = student.ToList<Level>();


    第三种方式:

    //Uri uri = new Uri("MyResource/MyPeople.xml", UriKind.Relative);
                    //StreamResourceInfo sri = Application.GetResourceStream(uri);
                    //if (sri != null)
                    //{
                    //    XmlSerializer serializer = new XmlSerializer(typeof(List<Person>));
                    //    List<Person> data = (List<Person>)serializer.Deserialize(sri.Stream);
                    //    this.listBox.ItemsSource = data;
                    //}  
                    //Stream stream = App.GetResourceStream(new Uri("HRD;component/AllLevels.xml", UriKind.Relative)).Stream;
                    //XmlSerializer serializer = new XmlSerializer(typeof(List<Level>));
                    //listLevels = (List<Level>)serializer.Deserialize(stream);

    首先需要读取XML文件获取XDocument对象,然后去取里面的值,可以按字段读取,也可以直接反序列化成你需要的对象。

    但是因为这些代码是我从WP7的项目里拿出来的,以下这句你需要自己改下:

    Stream stream = App.GetResourceStream(new Uri("HRD;component/AllLevels.xml", UriKind.Relative)).Stream;

    改成在你的SDK版本里读取文件的方式。

    还有一种思路,如果你自己有服务器的话,可以把数据源以api的形式提供出来,手机客户端去网络查询数据。但这样还需要开发服务器端接口,貌似更复杂了一些,但好处是如果数据有变动,不需要更新客户端程序。

    至于你一会生成xap,一会生成exe,还是对各平台的SDK不熟悉导致的,WP8 Silverlight之前的SDK生成的是xap包,以后的是appx了,如果是Win10 UWP项目,部署到手机时需要编译为ARM,部署到电脑时需要编译为x86,部署到手机模拟器上也需要编译为x86。

    针对你的问题来说,如果数据量不多的话,还是转换为XMl文件最简单,查询数据使用Linq查询就行了。

    2015年11月18日 2:18
  • To yan_xiaodi

    您的第一个问题我确实没有搞清楚这几者之间的关系和区别,回头我去补习一下基础知识,起码应该弄清楚自己要做的属于哪一类。

    嗯,关于您说的第二条XML的应用,列为一种解决方案,下一步也看一下相关的应用案例和教程。至于API的概念我就更不清楚了。

    在之后的一个问题您的回答,我觉得好像没看明白,因为生成XAP也好还是appx也好都是WP的应用,但之后我生成的exe就应不是了,但是还是可以部署在WP模拟器上,手机上却不行。很奇怪。

    XML最简单的话,我这就去找些教程和实例看看!感谢!

    2015年11月18日 11:30