Android中數據存儲之文件存儲、數據庫存儲

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章