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解析的內容成功保存到數據庫中。