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解析的内容成功保存到数据库中。

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