Introduction
之前介紹過的Intent可以轉換到另一頁並傳遞資料(Bundle),另外還有其他方式可以儲存資料並傳輸。例如:- SharedPreferences。
- Internal or external storage。
- Database。
SharedPreferences
大概是最簡單的方式,使用SharedPreferences物件。開啟新的專案,在其上設計兩個Plain text(用以輸入first name與last name),然後在之下設計兩個按鈕,第一個顯示Save,另一個顯示Load,此外,在其下加上一個TextView用以顯示文字。如下: Java code如下:Test > Main3Activity.java
- 跟之前一樣,取得所有物件並命名(btSave, btLoad, txtFirstName, txtLastName, tvDisplay)。
- btSave的onClick事件中,宣告SharedPreferences名稱為sp,並用getPreferences()方法回傳(Context.MODE_PRIVATE表示僅可被應用程式使用,傳入內容會覆蓋原內容)。
- 使用sp.edit()方法產生SharedPreferences.Editor,用來編輯儲存檔案。
- 使用putString方法來儲存資料,第一個參數為資料名稱(key),第二個為數值(value)。
- 使用apply()或commit()來儲存資料,apply()是asynchronously,commit()是synchronous並傳回一個boolean值。
- Toast.makeText(...).show()可用來短暫顯示訊息(類似pop-up window)。
- 在Load按鈕的onclick事件內,再度使用getPreferences(Context.MODE_PRIVATE)來建立SharedPreferences物件。
- 接下來使用sp.getString(...)來取得資料,第二個參數為沒得到數值的預設值。
- 使用setText()方法在TextView內顯示資料。
getSharedPreferences
上述的例子僅能在同一個Activity內操作,若是要在另一個Activity使用資料,則方式如下。首先設計另一個Activity,其中包含一個按鈕與一個TextView,按鈕用來觸發取得資料,TextView用來顯示資料(當然也可以利用Toast等其他方式顯示資料)。接下來將上例中的Save內的onClick事件中的SharedPreferences sp = getPreferences(Context.MODE_PRIVATE);這一行comment掉,修改如下:
Test > Main3Activity.java
- getSharedPreferences(file, Context.MODE_PRIVATE)方法,請注意多了第一個參數為檔案名。
- 此處依然是使用getSharedPreferences("myFile1", Context.MODE_PRIVATE);來產生SharedPreferences物件。
- 因為是使用getSharedPreferences,所以在此可以直接取得myFile1檔案內的fname, lname等資料,將這些資料顯示在TextView(tvPreferences)內。
- 使用SharedPreferences物件只能夠儲存傳遞primitive types and string types,複雜的檔案型態(e.g. 圖片,聲音,影片等)無法儲存傳遞。
- getSharedPreferences的效果應該也可以使用getPreferences()+Intent(Bundle)來傳遞資訊。。
Internal Storage
直接將資料檔案儲存在手機內存內,使用openFileOutput(filename, Context.MODE_APPEND)來開啟輸入資料流(write),或使用openFileInput(filename)來開啟讀取資料流(read),範例的元件配置為設置一個editText(可以輸入多行資訊),兩個按鈕(一顯示Save,一顯示Load),最後再設置一個TextView用以顯示資料。Test > Main4Activity.java
- 設計saveData()與loadData()兩個方法來分別回應兩個Button的onClick事件。
- 使用out = openFileOutput(filename, Context.MODE_APPEND);程式碼來建立資料流,此方式可能會傳回FileNotFoundException。若是不想append,可以使用Context.MODE_PRIVATE來重新建立檔案內容,。
- 使用out.write(str.getBytes());來將資料寫入檔案,此方式僅能使用Bytes且可能傳回IOException。
- 使用out.close();方法來結束資料流。
- 讀取方式亦相同,使用in = openFileInput(filename);建立資料流。
- 使用in.read()讀取資料,若傳回-1表示到了文件最後。
- StringBuilder.append來將資料加入檔案,讀取資料須先cast為char。
Room
使用Room來溝通資料庫。首先將以下程式碼加入到build.gradle的dependencies內。- 上述內容為本文撰寫時目前版本,若版本過舊,可在此找到最新的版本。
php3_4_time.php
- setcookie的參數涵義為:
- $name: cookie名稱。
php3_4_time.php
- setcookie的參數涵義為:
- $name: cookie名稱。