积极答复者
关于vs2015community版开发windows phone时使用本地数据库的疑问及方法请教

问题
-
各位好,小弟初学编程吧,主要是因为自救有些事情比较繁琐,所以想把它拿到手机上做。简单说下,我有一张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查询就行了。
- 已建议为答案 Xavier Xie-MSFT 2015年12月10日 2:34
- 已标记为答案 Jamles Hez 2015年12月11日 2:00
2015年11月18日 2:18
全部回复
-
你好,通过你的问题,了解到你还有些基础知识没有掌握,我建议先搞明白以下几点:
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查询就行了。
- 已建议为答案 Xavier Xie-MSFT 2015年12月10日 2:34
- 已标记为答案 Jamles Hez 2015年12月11日 2:00
2015年11月18日 2:18