android數據持久化

一、數據持久化

1.1 定義

數據持久化就是將內存中的瞬時數據保存到存儲設備中,保證即便在手機或者是電腦關機的狀況下,數據也不會丟失。java

1.2 方式

在android中數據持久化分爲三種:文件存儲、SharedPreferences存儲和數據庫存儲。android

1.3 三種方式對比

數據持久化三種方式對比sql

方式 保存路徑 涉及到的類 特色
文件存儲 /data/data/<packagename>/files/ //從文件中讀取數據
Context.openFileInput(String fileName):FileInputStream 
//將數據存儲到文件中
Context.openFileOutput(String fileName, int mode):FileOutputStream 
不對存儲的內容進行任何的格式化處理,比較合適存儲一些簡單的文本數據或二進制數據
SharedPreferences存儲 /data/data/<packagename>/shared_prefs/ Context.getSharedPreferences(String name, int mode):SharedPreferences
Activity.getPreferences(int mode):SharedPreferences
PreferenceManager.getDefaultSharedPreferences(Context context):SharedPreferences
使用鍵值對的方式來存儲數據,保存數據更加方便。數據以明文的方式保存在文件中,須要加密
數據庫 /data/data/<packagename>/databases/ SqLiteOpenHelper類、SQLiteDatabase類 能夠保存大量複雜的關係型數據 


二、文件存儲

2.1 存儲數據

    調用的方法:Context.openFileOutput(String fileName, int mode):FileOutputStream數據庫

    其中,mode的值有兩個,分別爲:Context.MODE_PRIVATE和Context.MODE_APPENDapp

    Context.MODE_PRIVATE:爲默認模式,表示當指定相同文件名的時候,會覆蓋原有文件。this

    Context.MODE_APPEND:表示文件已經存在時,會將內容追加到以前的文件中。加密

    下面是一個例子:spa

/**
     * 保存數據
     * @param view
     */
    public void saveData(View view){
        String text = inputText.getText().toString();
        if(!TextUtils.isEmpty(text)){
            FileOutputStream fileOutputStream = null;
            BufferedWriter fileWriter = null;
            try{
//                fileOutputStream = FilePersistenceActivity.this.openFileOutput(FILENAME, Context.MODE_PRIVATE);//每次文件都是會被覆蓋掉
                fileOutputStream = FilePersistenceActivity.this.openFileOutput(FILENAME, Context.MODE_APPEND);//在原有文件的基礎之上追加內容
                fileWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
                fileWriter.write(text);
                fileWriter.write("\r\n");
            }catch (FileNotFoundException e){
                Log.e(TAG, "saveData: 文件不存在");
            }catch (IOException e){
                Log.e(TAG, "saveData: IOException"+e.getMessage() );
            }finally {
                try {
                    if (null != fileWriter) {
                        fileWriter.close();
                    }
                }catch (IOException e){
                    Log.e(TAG, "finally: IOException"+e.getMessage() );
                }
                inputText.setText("");
            }
        }
    }

2.2 讀取數據

    從文件中讀取數據Context.openFileInput(String fileName):FileInputStream3d

     示例代碼:code

/**
     * 讀取數據
     * @param view
     */
    public void readData(View view){
        FileInputStream fileInputStream = null;
        BufferedReader bufferedReader = null;
        try {
            fileInputStream = FilePersistenceActivity.this.openFileInput(FILENAME);
            bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
            String readLine = null;
            StringBuffer stringBuffer = new StringBuffer();
            while (!TextUtils.isEmpty(readLine = bufferedReader.readLine())){
                stringBuffer.append("\r\n");
                stringBuffer.append(readLine);
            }
            inputtedText.setText(stringBuffer.toString());
        }catch (FileNotFoundException e){
            Log.e(TAG, "readData:" +e.getMessage());
        }catch (IOException e){
            Log.e(TAG, "IOException:" +e.getMessage());
        }finally {
            try {
                if(null != bufferedReader){
                    bufferedReader.close();
                }
            }catch (IOException e){
                Log.e(TAG, "IOException:" +e.getMessage());
            }
        }
    }

三、SharedPreferences

    3.1 三種不一樣的實現方式對比

    在這個程序中,對應的包名爲:

三種不一樣的實現方式對比

實現方式 方法解析 保存的文件名
Context.getSharedPreferences(String name, int mode):SharedPreferences

name:SharedPreferences文件的名稱.

mode:目前只有MODE_PRIVATE這一種模式,是默認操做,表示只有當前的程序才能夠對此SharedPreference進行操做

name所定義的名字

Activity.getPreferences(int mode):SharedPreferences  

當前活動的類名做爲文件名

PreferenceManager.getDefaultSharedPreferences(Context context):SharedPreferences  

當前應用程序包名做爲前綴

    3.2 保存數據

        調用SharedPreferences.Editor類,使用putXXX()方法,而後調用SharedPreferences.Editor的apply()便可。具體使用哪個put方法,根據數據類型來決定。

    3.3 讀取數據

        直接調用SharedPreferences類的getXXX()方法。具體調用哪個get方法,根據數據類型來決定。

四、數據庫

    Android主要使用Sqlite數據庫做爲系統默認數據庫。

4.1 主要涉及到的類

    主要涉及到SQLiteOpenHelper和SQLiteDatabase這兩個類。SQLiteOpenHelper是一個接口,主要負責數據庫的建立和升級。SQLiteDatabase類主要負責執行對應的sql語句。

    SQLiteOpenHelper接口有onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)這兩個方法須要重寫,onCreate方法在數據庫初次被建立時調用。onUpgrade方法,在傳入的newVersion參數發生改變的時候,進行調用。newVersion參數,在SQLiteOpenHelper的構造方法中傳入。

    其中SQLiteDatabase能夠經過SQLiteOpenHelper類的getWritableDatabase()和getReadableDatabase()這兩個方法得到。當數據庫不能夠寫入的時候,調用getWritableDatabase()會出現異常。調用這兩個方法的過程當中,會建立或者打開已有的數據庫文件。

4.2 執行增刪改查所對應的方法

    對於數據庫的增長、修改、和刪除操做均可以直接調用execSQL方法,可是查詢就須要調用rawQuery方法。

    具體事例以下:

sqLiteDatabase.exeSql("delete from book where name = ?",new String[]{"java"});
sqLiteDatabase.exeSql("update book set price = ? where name = ?",new String[]{"123","java"});
sqLiteDatabase.exeSql("insert into book(name,author,price)values(?,?,?);",new String[]{"java","cxy","23.56"});
Cursor cursor = sqLiteDatabase.rawQuery("select * from book",null);

4.3 數據庫中主要的數據類型

    integer表示整形,real表示浮點型,text表示文本類型,blob表示二進制類型。

相關文章
相關標籤/搜索