在之前学到的关于保存数据的方式时,我介绍了一种用SharedPreferences类保存数据信息成xml文件。具体实现请看这里
那么,它是如何实现的呢,这也正是今天我要写下的内容:生成xml文件。
我们肯定用过备份数据的app,短信啊照片啊,根据这个实际的业务需求,今天就来实现以下短信数据的备份。
1. 首先是设计一个按钮,假设单击这个按钮后会自动备份手机上的短信到sd卡。
那么我们就要给这个按钮绑定单击事件。事件里面当然就是写如何把数据存到xml文件以实现备份功能。
因为不知道怎么获取手机短信,那么首先我们需要模拟获取手机短信的功能。
很简单的定义一个list,放置所有短信的集合。每条短信都有发送时间、内容、收信人/发信人、id。
然后就可以很简单的在备份按钮的单击事件里写生成xml文件的代码了。
先定义StringBuilder,然后调用该类的append方法,先添加xml文件编码格式"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
然后就是添加自己定义的标签,比如短信集<smss>短信<sms>短信内容<body>等等,在写完开始标签后记得写结束标签。没什么难度吧,这是第一种。
2. 第二种跟第一种的差别在于,它用到了另外一个类,XmlSerializer。
在定义好文件输出流的实例后,用XmlSerializer的实例的setOutput方法指定文件并指定编码格式
XmlSerializer x = Xml.newSerializer();
File f = new File(Environment.getExternalStorageDirectory(),"backUp2Sms.xml");
FileOutputStream fos = new FileOutputStream(f);
//初始化序列化器 指定xml数据写入到哪个文件 并且指定文件编码格式
x.setOutput(fos, "UTF-8");
紧接着,就可以看开始xml文件的输出了,首先跟第一种方法一样,先添加文件编码格式,不过是用x.startDocument()方法来添加的,传递了两个参数,第一个是编码格式,第二个参数是是否独立。
接下来是用x.startTag()方法进行创建标签,也是两个参数,第一个命名空间,第二个标签名字。命名空间不是太懂。。。
当你需要向一个标签添加属性的时候,你需要调用x.attribute()方法,传递三个参数,分别是命名空间,参数名,参数值。
当需要设置标签内的内容时,调用x.text()方法,结束标签跟开始差不多,只不过是start换成了end,最终结束文档时的标签是x.endDocument()方法。
x.startDocument("UTF-8", true);
x.startTag(null, "smss");
for(SmsInfo s : list){
x.startTag(null, "sms");
x.attribute(null, "id", s.getId()+"");
x.endTag(null, "sms");
x.startTag(null, "address");
x.text(s.getAddress());
x.endTag(null, "address");
x.startTag(null, "body");
x.text(s.getBody());
x.endTag(null, "body");
x.startTag(null, "date");
x.text(s.getDate()+"");
x.endTag(null, "date");
x.startTag(null, "type");
x.text(s.getType()+"");
x.endTag(null, "type");
}
x.endTag(null, "smss");
x.endDocument();
fos.close();
Toast.makeText(this, "备份成功", 0).show();
这就是所谓的两种生成的xml的方式,没感觉第二种有什么优势,也可能因为没有实战经验。