Android中常见的持久化数据存储方法有三个:文件存储、SharedPreferences存储和数据库存储。文件存储的核心思想是将数据按照streaming的形式保存到本地,这点与C++有共通点。写一个利用文件存储数据的简单实例,重新定义《MPD解析模块在Android中的实现》中提到的parseXMLWithPull(String xmlData)方法,在showResponse()后接着调用Save()方法,将解析数据保存到本地:
private void parseXMLWithPull(String xmlData) { //MPD解析方法
Represent repres = new Represent();//实例化一个Representation对象
String line = "";
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); //获得一个XMLPULL工厂类的实例
XmlPullParser xmlPullParser = factory.newPullParser(); //获得一个XML解析器的实例
xmlPullParser.setInput(new StringReader(xmlData));
int eventType = xmlPullParser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();
switch (eventType) {// 通过判断事件类型来选择执行不同的代码
// 开始解析某个结点
case XmlPullParser.START_TAG: {
if ("Representation".equals(nodeName)) {//由<Representation开始解析
repres.setId(xmlPullParser.getAttributeValue(null, "id"));
repres.setWidth(xmlPullParser.getAttributeValue(null, "width"));
repres.setHeight(xmlPullParser.getAttributeValue(null, "height"));
}
break;
}
// 完成解析某个结点
case XmlPullParser.END_TAG: {
if ("Representation".equals(nodeName)) { //由Representation--/>结束解析
Log.d("Representation", "id is " + repres.getId());//在调试窗口logcat打印出属性值
Log.d("Representation", "width is " + repres.getWidth());
Log.d("Representation", "height is " + repres.getHeight());
line = line +"ID: "+ repres.getId()+"; WIDTH: "+repres.getWidth()+"; HEIGHT: "+repres.getHeight()+";\n";
//将已经遍历的属性值连接成一个字符串,并注意换行
}
break;
}
default:
break;
}
eventType = xmlPullParser.next();
}
showResponse(line);//将字符串对象传入showResponse()方法,打印在UI的TextView
Save(line);//保存数据到本地文件
} catch (Exception e) {
e.printStackTrace();
}
}
利用文件存储方式保存数据,Save()方法可以定义为:
public void Save(String streaming){
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("mpd", Context.MODE_APPEND);
//文件名定义为mpd,因为会多次调用Save()方法,不希望每次覆盖之前内容,因此声明为MODE_APPEND
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(streaming);
}catch (IOException e){
e.printStackTrace();
}finally {
try{
if(writer != null){
writer.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
Run App之后点击MainActivity页面的send request按钮,执行:
在Device File Explore视窗中Data/Data/应用包名/files/下面找到新创建的mpd文件:
打开mpd文件,查看存储的解析数据:
在真机上运行App,但是通过手机的管理文件夹不能搜索到mpd文件,网上的解答是,应用的数据文件不能被用户直接看到,只有将手机ROOT后才可以看到Data文件。
文件存储只适用于保存一些简单的数据和键值对,当需要存储大量复杂的关系型数据时,便会用到数据库。使用SQLite数据库对上面的实例进行重写。首先建立一个MPDdatabaseHelper类,继承自SQLiteOpenHelper类,重写父类的构造方法、onCreate()方法和onUpgrade()方法,并定义表单的创建语句构成的数据成员字符串。
package com.example.xmlparser;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
/**
* @Author Fupenzi on 2019/1/4.
* @Blog https://blog.csdn.net/qq_34041083
*/
public class MPDdatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_DATABASE = "create table MPD("
+"id string primary key,"
+"width string,"+"height string)";
private Context context;
public MPDdatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase database){
database.execSQL(CREATE_DATABASE);
}
@Override
public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion){
}
}
在public class MainActivity extends AppCompatActivity implements View.OnClickListener 类中声明类MPDdatabaseHelper对象成员:
private MPDdatabaseHelper mpdHelper;
并在MainActivity活动的onCreate()方法中对mpdHelper对象进行实例化
mpdHelper = new MPDdatabaseHelper(this, "MPD.database",null,1);
在private void parseXMLWithPull() 方法中创建数据库并声明数据填充对象
SQLiteDatabase database = mpdHelper.getWritableDatabase();
//getWritableDatabase()方法检测并创建数据库,返回一个数据库对象
ContentValues values = new ContentValues();//数据库内容填充对象
在case XmlPullParser.END_TAG:……解析结果后面,对将解析结果写入到数据库内容对象中,并将写好的内容insert到表单中,之后清空内容对象。
values.put("id",repres.getId());
values.put("width",repres.getWidth());
values.put("height",repres.getHeight());
database.insert("MPD",null,values);
values.clear();
Run App,通过文件夹视窗可以看到创建的表单:
再通过Terminal进入到该目录利用命令行窗口查看MPD.database中的内容
可以看到表单内容和之前本地文件存储的内容一样,说明MPD解析的内容成功保存到数据库中。