Android資料儲存與IO(摘自瘋狂Android講義)

weixin_34037977發表於2016-11-28

前言碎語:今天是第一次在簡書上寫東西,以前總是說要記筆記,但是簡書上又有很多東西了,一查就能找得到。但是別人寫的畢竟是別人的,自己寫的才是自己的,雖然我這個是從書本摘抄的,但也是我的一份辛勤勞動啊,記的是我在學習的時候,對理解有幫助的東西。這也是我第一次使用MarkDown語法編輯東西,介面可能會有點醜,如果有看官看到,就不要吐槽了,因為我真的是個菜鳥。

1.使用SharedPreferences

1.1 SharedPreferences與Editor簡介


   SharedPerferences儲存的資料主要是簡單型別的key-value對。

SharedPreferences介面主要負責讀取應用程式的Preferences資料。它提供瞭如下方法訪問SharedPreferences中的key-value對。

  • boolean contains(String key):判斷SharedPreferences是否包含指定key對應的value。
  • abstract Map<String, ?> getAll():獲取SharedPreferences資料裡全部的key-value對。
  • boolean getXxx(String key, xxx defValue):獲取SharedPreferences資料裡指定key對應的value。如果該key不存在,則返回預設值defValue。

SharedPreferences介面本身並沒有提供寫入資料的能力,而是通過SharedPreferences的內部介面,SharedPreferences呼叫edit()方法即可獲取它所對應的Editor物件。Editor提供瞭如下方法來向SharedPreferences寫入資料。

  • SharedPreferences.Editor clear():清空SharedPreferences裡的所有資料。
  • SharedPreferences.Editor putXxx(String key,xxx value):向SharedPreferences存入指定key對應的資料。

  • SharedPreferences.Editor remove(String key):刪除SharedPreferences裡指定key對應的資料項。

  • boolean commit():當Editor編輯完成後,呼叫該方法提交修改。

    總結一下:SharedPreferences負責根據key讀取資料,而SharedPreferences.Editor則用於寫入資料。
    SharedPreferences本身是一個介面,程式無法直接建立SharedPreferences例項,只能通過Context提供的getSharedPreferences(String name,int mode)方法來獲取SharedPreferences例項。
    其中mode有3個值可供選擇,但是從Android4.2開始推薦使用Context.MODE_PRIVATE,表示該SharedPreferences資料只能被本應用程式讀寫。

1.2 SharedPreferences的儲存位置和格式


下面舉個例子,示範如何向SharedPreferences中寫入、讀取資料。程式介面很簡單,只是提供兩個按鈕,一個用於寫入資料,一個用於讀取資料。

public class MainActivity extends Activity
{
    SharedPreferences preferences;
    SharedPreferences.Editor editor;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 獲取只能被本應用程式讀、寫的SharedPreferences物件
        preferences = getSharedPreferences("crazyit", MODE_PRIVATE);
        editor = preferences.edit();
        Button read = (Button) findViewById(R.id.read);
        Button write = (Button) findViewById(R.id.write);
        read.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View arg0)
            {
                // 讀取字串資料
                String time = preferences.getString("time", null);
                // 讀取int型別的資料
                int randNum = preferences.getInt("random", 0);
                String result = time == null ? "您暫時還未寫入資料" : "寫入時間為:"
                        + time + "\n上次生成的隨機數為:" + randNum;
                // 使用Toast提示資訊
                Toast.makeText(MainActivity.this, result
                        , Toast.LENGTH_SHORT).show();
            }
        });
        write.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View arg0)
            {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 "
                        + "hh:mm:ss");
                // 存入當前時間
                editor.putString("time", sdf.format(new Date()));
                // 存入一個隨機數
                editor.putInt("random", (int) (Math.random() * 100));
                // 提交所有存入的資料
                editor.commit();
            }
        });
    }
}

SharedPreferences中的資料總是儲存在/data/data/<package-name>/shared_prefs目錄下,SharedPreferences資料總是以XML格式儲存。
單擊“寫入資料”後,在點選“讀取資料”按鈕,結果如下圖所示:


2856867-4541f6833f44be98.png
Screenshot_1480327652.png

1.2 File儲存

1.2.1 openFileInput和openFileOutput

Context提供瞭如下兩個方法來開啟應用程式的資料資料夾裡的檔案IO流。

  • FileInputStream openFileInput(String name):開啟應用程式的資料資料夾下的name檔案對應的輸入流。
  • FileOutputStream openFileOutput(String name,int mode):開啟應用程式的資料資料夾下的name檔案對應的輸出流。

其中第二個方法的第二個引數指定開啟檔案的模式,該模式支援如下值:

  • MODE_PRIVATE:該檔案只能被當前程式讀寫
  • MODE_APPEND:以追加的方式開啟該檔案,應用程式可以向檔案中追加內容
  • 還有兩種從Android4.2開始就不推薦使用了,此處就不列舉出來了

除此之外,Context還提供瞭如下幾個方法來訪問應用程式的資料資料夾。

  • getDir(String name,int mode):在應用程式的資料資料夾下獲取或建立name對應的子目錄。
  • File getFilesDir():獲取應用程式的資料資料夾下的絕對路徑。
  • Strin[] fileList():返回應用程式的資料資料夾下的所有檔案。
  • deleteFile(String):刪除應用程式的資料資料夾下的指定檔案。

下面貼出寫入與讀取的模板:

2856867-c3ed17fedce54c5f.png
寫入模板.png

2856867-3e1af960ba0cf767.png
讀取檔案.png

其中new StringBuilder(buff,0,hasRead)是用它的構造方法將位元組陣列轉換為字串,hasRead表示已讀取的位元組數。
小結一下:向檔案中輸入用到輸出流,從檔案中讀取用到輸入流

1.2.2 讀寫SD卡上的檔案

讀寫SD卡上的檔案按如下步驟:
1.呼叫Environment的getExternalStorageState()方法判斷手機上是否插了SD卡,並且應用程式具有讀寫SD卡的許可權。例如下面程式碼:如果手機已插入SD卡並且應用程式具有讀寫SD卡的能力,下面語句返回true

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

2.呼叫Environment的getExternalStorageDirectory()方法來獲取外部儲存器,也就是SD卡的目錄。
3.使用FileInputStream、FileOutputStream、FileReader或FileWriter讀寫SD卡里的檔案。

注意事項:讀寫SD卡上的資料,必須在AndroidManifest.xml中新增讀寫SD卡的許可權。

例如下面的配置:

 <!-- 在SD卡中建立與刪除檔案許可權 -->
 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">
 <!-- 向SD卡寫入資料許可權 -->
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">

下面貼出寫入與讀取SD卡上的檔案模板:

2856867-0c59c81155b7ab44.png
寫入SD卡.png
2856867-529a6a740f25fb6f.png
讀取SD卡.png

1.3 SQLite資料庫

Android系統整合了一個輕量級的資料庫:SQLite

1.3.1 SQLiteDatabase簡介

Android提供了SQLiteDatabase代表一個資料庫,一旦應用程式獲得了代表資料庫的SQLiteDatabase物件,接下來就可通過SQLiteDatabase物件來管理、運算元據庫了。
由於最近學習了LitePal資料庫框架,我在想有沒有必要介紹SQLiteDatabase了。
這沒有斷更~~~

相關文章