这一点雕虫小技可能对熟悉的人来说已经不值一提。但是我想,既然这些都是常用的功能,集成在一起做个笔记也有点意义吧。
首先,json 是传递数据的事实标准了。所以先说一下将它从服务器端下载下来。.net 里的库是极好的,这也是我对Xamarin颇有好感的一个原因。一个WebClient就可以将任何数据下载下来,爽极了。
System.Net.WebClient wc = new System.Net.WebClient();
string s = wc.DownloadString(http://192.168.0.100/data.json);
当然,服务器端要有这个文件,或者一个能够返回json数据的网页。
下一步,如果我想把这个文件保存到本地呢?也好办,用一个System.IO.File,一句话即可搞定。System.IO.File.WriteAllText("localdata.json",s);
这里需要注意的是,本地文件保存的时候涉及到权限。所以最好保存到应用的私有空间内,也保证了安全,象下面这样。
string fn = System.IO.Path.Combine(System.Environment.GetFolderPathSystem.Environment.SpecialFolder.Personal) ,"localdata.json");
System.IO.File.WriteAllText(fn,s);
如果没有涉及到数据库的内容,到此就结束了。
可是,有很多需求是想把服务器端的数据保存到本地数据库。这样用起来方便且快。安卓中最常用的数据库是SQLite. 与之对应的库是SQLite.net. 这个库也是极好的,使用起来极其简便。同时,他也是一个ORM,所以满足了绝大多数人的口味。
使用时,需要引用它的Package,直接install-package。但是在这个之前,我想把json数据变成对象再保存在数据库里,这样用起来方便。所以先引用json库。
install-package Newtonsoft.json
它自动给下载了匹配当前工程的最新版本,目前的版本是10.0.2。然后写代码,编译。
出问题了。竟然编译不通过!说它依赖的一个库可能不匹配Xamarin android profile。
弄了很久,最后安装了6.0.0版,编译通过了。到现在不知道什么原因。
加上引用后,就要使用了。我首先将前面的json文件反序列化成对象列表,我这里定义了一个User类。
List<User> list= JsonConvert.DeserializeObject<List<User>>(s);
竟然十分顺利地成功了。
下一步需要引用SQLite.net库了。这次很顺利,没出什么乱子。
Install-Package sqlite-net-pcl
用的是sqlite-net-pcl,专门为移动设备用的吧?
下一步,建表。
var cnn= new SQLite.SQLiteConnection(Helper.PrivateFileName("db"));
cnn.CreateTable<User>();
需要先建立SQLiteConnection对象,参数是本地的数据库文件名。然后用CreateTable<T>来建表。
接下来,把数据插入表中。
cnn.InsertAll(list);
再下面,查询全部数据。
List<User> users = cnn.Table<User>().ToList();
代码都是那样简洁,那样美丽,几乎都是一句。
令人感动的是C#和.net库,处处透露着简洁至上的理念,非常喜欢这风格。不像某些语言,总是把简单问题复杂化,非要把什么东西都定义成类,有故弄玄虚之嫌。
今天就先到这里吧,以后再说点更详细的东西。