Android – 資料存取機制 – 專案專屬空間存取

在專案運作過程中, 除了專案原始碼加上專案資源檔案編譯為.apk之後, 當使用者在執行app的時候會需要將相關資料進行儲存及使用時, 就將是本章節所要探討的資料儲存存取機制.

有以下幾個主要的面向來進行探討:

  • 使用者的偏好設定
  • 專屬於app的檔案資料
  • 可以共用的檔案資料
  • 存取本機資料庫結構
  • 讀取專案特定資源資料

專案專屬空間存取


在應用程式執行中,當需要針對使用者相關的檔案進行存取,而這種類 型的檔案的特性,通常是僅針對應用程式使用而已,例如程式中的物件序列 化檔案,當下次執行該應用程式的時候,或是使用者手動暫停後繼續執行, 可以讀取該物件解序列化檔案繼續之前的執行過程等等。主要的觀念在於該 類型的檔案是配合應用程式才有作用,當使用者解除安裝之後,這類型的檔 案就沒有存在的意義,那就非常適用使用內部檔案存取機制。千萬別與應用 程式的照相功能或是錄音功能所產生的檔案存取機制搞混,因為相片檔案或 是其他類似型態檔案,使用者利用應用程式產生之後,還是可以透過其他應用程式進行存取,那種檔案存取機制就是屬於外部共用檔案存取。本小節的檔案與上一節的偏好設定一樣,是存放在專案專屬的內存空間。

處理程序


建立及寫出內部檔案到裝置的儲存空間之基本程序:

呼叫 Context 的 openFileOutput() 方法,傳回一個 java.io.FileOutputStream 物件實體。以 java.io.FileOutputStream 物件實體的 write() 方法進行資料寫入裝置的 儲存空間。

寫入完成之後,呼叫 java.io.FileOutputStream 物件實體的 flush()方法將資料流從緩衝區清出, 在呼叫close() 方法 關閉檔案輸出串流。

呼叫 openFileOutput() 方法,可以傳遞兩個參數決定不同寫出模式:

  • MODE_PRIVATE:每次寫出會刪除原來內容。
  • MODE_APPEND:每次寫出會保留原內容,而從檔案尾端開始寫出。

以上方法雖然沒有寫入任何資料,一旦執行之後,就已經會產生指定的 檔案 /data/data/<Package-Name>/files/MyData.txt,檔案大小為 0。

接著進行文字資料寫出,呼叫 FileOutputStream 物件實體的 write() 方 法,將欲寫出的資料轉成 byte 陣列型態,傳遞參數寫出即可。

 

以下範例實際進行兩種不同模式的存取, 並以相同的讀取方式取出檔案內容.

先處理基本版面配置.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Write (Private Mode)"
        android:onClick="write1"
        />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Write (Append Mode)"
        android:onClick="write2"
        />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Read"
        android:onClick="read"
        />

    <TextView
        android:id="@+id/mesg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</LinearLayout>

 

回到MainActivity.java

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {
    private TextView mesg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mesg = (TextView)findViewById(R.id.mesg);
    }

    public void write1(View view){
        String data = "Hello, World\n";
        try {
            FileOutputStream fout = openFileOutput("MyData.txt", MODE_PRIVATE);
            fout.write(data.getBytes());
            fout.flush();
            fout.close();
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }

    public void write2(View view){
        String data = "Hello, World\n";
        try {
            FileOutputStream fout = openFileOutput("MyData.txt", MODE_APPEND);
            fout.write(data.getBytes());
            fout.flush();
            fout.close();
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }

    }

    public void read(View view){
        try {
            FileInputStream fin = openFileInput("MyData.txt");
            BufferedReader reader =
                    new BufferedReader(new InputStreamReader(fin));
            String line = null;
            StringBuilder builder = new StringBuilder();
            while ( (line = reader.readLine()) != null){
                builder.append(line + "\n");
            }
            mesg.setText(builder);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

以上的專案專屬空間的資料, 以及偏好設定的資料檔案, 都會與專案app共存. 只要使用者將專案移除, 這些資料都將會隨著一併被移除, 或是使用者在行動裝置端的設定中, 將app的資料清除.

例如下圖中的CLEAR DATA的按鈕.

 

 

 

 

 

 

 

 

 

 

 

 

%d bloggers like this: