接着上面的那个数据存储问题,今天我灵机一动,发现,Json是可以存储多行数据的,只不过表现形式和数据库的那种多行存储是不一样的,真是把我高兴坏了,下面我来出解决方案。
首先,我来说一下我们要实现的功能就是要保存学生的各种信息,有学生的学号,然后有学生性别,姓名,专业名称,喜好的图书种类。那么在这里,学生的学号就是每一行(这里说的一行就是指学生的所有属性行)信息的主要Key,因为这个是不可重复的。
那么,这个问题的大体思路就是,我们创建一个Save类,然后声明一些属性,包括学生的学号等等信息,下面就是关键了,我们最关键的一步就是把学生的这些属性声明成集合,那么这样的话,集合就可以保存一列的值了。
经过在下的试验,这个方法是可行的,如下Save类:
然后再随便在一个脚本上写一个方法来实例化这个Save对象,并且利用LitJson去获取之前的数据,然后对Save对象添加新数据。如下脚本:
public Save SaveStuInfo(){
Save save = new Save ();
//添加新加入的信息
//save.stuID.Add("");
//save.stuName.Add("");
//save.stuSex.Add("");
//save.stuProfessional.Add("");
//save.stuBooks.Add("");
//return save;
string filePath = Application.dataPath + "/Res/StuInfoJson.json";
if (File.Exists(filePath)) {
//获得已经存在的信息
StreamReader sr=new StreamReader(filePath);
string jsonStr = sr.ReadToEnd ();
sr.Close();
save = JsonMapper.ToObject<Save> (jsonStr);
if (save.stuID [save.stuID.Count - 1] == "") {
save.stuID [save.stuID.Count - 1] = stuInfoText [0].text;
save.stuName [save.stuName.Count - 1] = stuInfoText [1].text;
save.stuSex [save.stuSex.Count - 1] = stuInfoText [2].text;
save.stuProfessional [save.stuProfessional.Count - 1] = stuInfoText [3].text;
save.stuBooks [save.stuBooks.Count - 1] = stuInfoText [4].text;
print ("执行了if");
save.stuID.Add("");
save.stuName.Add("");
save.stuSex.Add("");
save.stuProfessional.Add("");
save.stuBooks.Add("");
}
return save;
}
这里面呢,我加了“”空字符串来做标志位,大家有好的方法也可以用,我这个相对比较麻烦,而且还要手动去调最开始的值,不知道为什么最开始的时候出现了空引用,所以我用了这个空字符串作为标志位。
然后就是写Json数据了:
Save save=gameController.SaveStuInfo();
string filePath=Application.dataPath+"/Res/StuInfoJson.json";
string saveJsonStr= JsonMapper.ToJson (save);
//StreamWriter是专门的写入流,是真正去写入的媒介,相当于写东西的笔
//这个笔写东西,当然是在参数上写的是要写入的内容路径
//然后用Write方法去真正写入内容
StreamWriter sw = new StreamWriter (filePath);
sw.Write (saveJsonStr);
sw.Close ();
print ("写入json数据成功");
这个相对比较简单,就不多说了,大概内容就是把那个存了老数据和新数据的新Save对象写进Json文件里面,从而达到了永久多行存储的效果。
大家如果有更好的用Json来存储多行数据的方法,欢迎交流!!