在前面的博客中介绍了使用内部存储存储数据、使用外部存储储存数据和使用SharedPreference保存数据,通过观察可知,前面三种存储数据的方式只适合保存信息量比较单一的数据,如现在手机中都会用一个短信备份的功能,当备份短信时,短信的信息量比较大,有收信人、信息内容、短信发送的时间等信息,为了解决这个问题android中提供了一个使用xml序列化器的方式保存数据,接下来介绍使用xml序列化器保存短信
首先制作一个如下所示的界面,在界面上放一个备份短信的按钮
单击备份按钮会在sd卡中生成一个sms.xml文件,打开sms.xml文件后可以看到备份的短信内容以xml的格式保存在sms.xml文件中
实现方式,首先使用Android Studio创建一个Android工程,并且创建一个Message类用于处理短信数据
Message类中的代码如下
package com.fyt.xmlserializer; //创建一个Message类,用于处理短信数据 public class Message { //短信的内容 private String body; //短信的发送日期 private String date; //收信人的地址(收信人的手机号码) private String address; //短信的类型 //0表示短信是发出去的 //1表示短信是收到的 private String type; //构造方法 public Message(String body,String date,String address,String type) { this.body = body; this.date = date; this.address = address; this.type = type; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getType() { return type; } public void setType(String type) { this.type = type; } }
然后修改MainActivity.java中的代码
package com.fyt.xmlserializer; import android.app.Activity; import android.os.Bundle; import android.util.Xml; import android.view.View; import org.xmlpull.v1.XmlSerializer; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; public class MainActivity extends Activity { //定义一个集合变量用于存储短信 private List<Message> smsList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //创建集合,用于存储短信 smsList = new ArrayList<Message>(); //向集合中添加10条模拟短信 for(int i = 0; i < 10; i++) { //创建短信 Message sms = new Message( "你上网了吗" + i,new Date(System.currentTimeMillis()) + "","1388978781" + i,"1"); //将短信添加到集合中 smsList.add(sms); } } //备份短信按钮响应函数 public void click(View view) { //拿到序列化器对象 XmlSerializer xs = Xml.newSerializer(); //创建文件对象,设置短信的储存路径 File file = new File("sdcard/sms.xml"); //捕获异常 try { //创建文件输出流 FileOutputStream fos = new FileOutputStream(file); //enconding:指定用什么编码生成xml文件 xs.setOutput(fos,"utf-8"); //设置xml中的头结点 //第一个参数:头结点中的enconding属性 xs.startDocument("utf-8",true); //设置开始结点 xs.startTag(null,"message"); //使用增强for遍历集合中的短信 for(Message sms : smsList) { xs.startTag(null,"sms"); //将短信的内容写入xml文件中 xs.startTag(null,"body"); xs.text(sms.getBody()); xs.endTag(null,"body"); //将短信的发送或者接收时间写入xml文件中 xs.startTag(null,"date"); xs.text(sms.getDate()); xs.endTag(null,"date"); //将短信的地址写入xml文件中 xs.startTag(null,"address"); xs.text(sms.getAddress()); xs.endTag(null,"address"); //将短信是发送方还是接收方的标记写入xml文件中 xs.startTag(null,"type"); xs.text(sms.getType()); xs.endTag(null,"type"); xs.endTag(null,"sms"); } //设置结束结点 xs.endTag(null,"message"); //告诉序列化器,文件生成完毕 xs.endDocument(); //处理操作中出现的异常 } catch (Exception e) { e.printStackTrace(); } } }
最后在配置文件中添加对SD卡的读权限和对SD卡的写权限
<!--对SD卡的写权限--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!--对SD卡的读取权限--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>