使用外部儲存
每個Android相容的裝置都支援用於儲存檔案的一個共用的外部儲存空間。這個儲存空間能夠是一種可移動的儲存介質(如SD卡)或是內部的(不可移動的)儲存空間。被儲存在外部儲存空間上的檔案是完全共用的,並且在啟用了USB儲存把檔案傳輸到電腦上時,使用者能夠修改這些檔案。
警告:如果應用把外部儲存空間掛載到電腦上或者移除這個儲存介質,那麼外部檔案就不能夠顯示了,並且這些儲存在外部儲存空間上的檔案沒有任何安全可言。所有的應用程式都能夠讀/寫放在外部儲存空間上的檔案,並且使用者也能夠刪除它們。
檢查儲存介質的可用性
在用外部儲存空間工作之前,應該始終調用getExternalStorageState()方法來檢查儲存介質是否可用。儲存介質可能被掛載在一個丟失的、或是唯讀等其他狀態的電腦上。以下是檢查可用性的方法:
boolean mExternalStorageAvailable
= false;
boolean mExternalStorageWriteable
= false;
String state
= Environment.getExternalStorageState();
if
(Environment.MEDIA_MOUNTED.equals(state))
{
// We can read and write the media
mExternalStorageAvailable
= mExternalStorageWriteable
= true;
}
else if
(Environment.MEDIA_MOUNTED_READ_ONLY.equals(state))
{
// We can only read the media
mExternalStorageAvailable
=
true;
mExternalStorageWriteable
=
false;
}
else {
// Something else is wrong. It may be one of many other states, but all we need
// to know is we can neither read nor write
mExternalStorageAvailable
= mExternalStorageWriteable
= false;
}
這個例子檢查了外部儲存空間是否可用於讀寫。你可能還想要檢查getExternalStorageState()方法的其他狀態,如儲存介質是否是共用的(被串連到一個電腦上),是否完全丟失、是否被惡意的刪除等等。使用這些狀態,在應用程式需要訪問儲存介質時,以便給使用者提供更多的通知資訊。
訪問外部儲存空間上的檔案
如果使用API層級8或更高的版本,可以使用getExternalFilesDir()方法來開啟一個File對象,它代表了應該儲存檔案的外部儲存空間目錄。這個方法需要一個type參數,它指定了想要的子目錄的類型,如DIRECTORY_MUSIC和DIRECTORY_RINGTONES(如果傳遞null,則會得到應用程式的檔案目錄的根目錄)。如果需要,這個方法會建立合適的目錄。通過指定目錄的類型,確保Android的介質掃描器把檔案正確的分類到系統中(例如,鈴聲被標識為鈴聲,而不是音樂)。如果使用者卸載了應用程式,應用對應的目錄和目錄中所有的內容將會被刪除。
如果使用API層級7或更低的版本,使用getExternalStorageDirectory()方法來開啟一個File對象,它代表了外部儲存空間的根目錄,然後應該把資料寫到下列目錄中:
/Android/data/<package_name>/files/
<package_name>是Java樣式的包名,如:com.example.android.app。如果使用者的裝置正在運行API層級8或更高的版本,並且卸載了應用程式,那麼這個目錄和其所有的內容將會被刪除。
儲存應該共用的檔案
如果儲存的檔案不是應用程式所專有的,並且在應用程式被卸載時,不刪除這些檔案,那麼就要把它們儲存到外部儲存空間上的一個公用的目錄上。這些目錄位於外部儲存空間的根目錄,如Music/、Pictures/、Ringtones/等等。
在API層級8或更高的版本中,使用getExternalStoragePublicDirectory()方法,把需要的公用目錄類型傳遞給這個方法,如DIRECTORY_MUSIC、DIRECTORY_PICTURES、DIRECTORY_RINGTONES或其他的類型。如果需要,這個方法會建立適當的目錄。
如果使用API層級7或更低的版本,使用getExternalStorageDirectory()方法來開啟一個File對象,它代表了外部儲存空間的根,然後把共用檔案儲存到下列目錄之一中:
Music/---媒體掃描器把在這個目錄中找到所有媒體檔案作為使用者音樂。
Podcasts/---媒體掃描器把在這個目錄中找到的所有媒體檔案作為音/視頻的剪輯片段。
Ringtones/---媒體掃描器把在這個目錄中找到的所有媒體檔案作為鈴聲。
Alarms/---媒體掃描器把在這個目錄中找到的所有媒體檔案作為鬧鐘的聲音。
Pictures/---所有的圖片(不包括那些用照相機拍攝的照片)。
Movies/---所有的電影(不包括那些用攝像機拍攝的視頻)。
Download/---其他下載的內容。
儲存快取檔案
如果使用API層級8或更高的版本,使用getExternalCacheDir()來開啟一個File對象,它代表了儲存快取檔案的外部儲存空間目錄。如果卸載應用程式,這些檔案會自動的被刪除。但是,在應用的生存期間,應該自己管理這些快取檔案,並且為了保留儲存空間,應在不需要的時候刪除這些快取檔案。
如果使用API層級7或更低的版本,就要使用getExternalStorageDirectory()方法來開啟一個File對象,它代表了外部儲存空間的根目錄,然後把快取資料寫入下列目錄中:
/Android/data/<package_name>/cache/
<package_name>是Java樣式的包名,如:com.example.android.app。
使用資料庫
Android提供了對SQLite資料的完全支援。應用中建立的任何資料庫都能夠通過類名來訪問,但在應用程式的外部不能訪問。
推薦建立一個新的SQLite資料的方法是,建立一個SQLiteOpenHelper類的子類,並且要覆寫onCreate()方法,在這個方法中能夠執行SQLite命令來建立資料庫中的表,例如:
public
class DictionaryOpenHelper
extends SQLiteOpenHelper
{
private
static final
int DATABASE_VERSION
= 2;
private
static final
String DICTIONARY_TABLE_NAME
= "dictionary";
private
static final
String DICTIONARY_TABLE_CREATE
=
"CREATE TABLE "
+ DICTIONARY_TABLE_NAME
+ " (" +
KEY_WORD
+
" TEXT, " +
KEY_DEFINITION
+
" TEXT);";
DictionaryOpenHelper(Context
context) {
super(context,
DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public
void onCreate(SQLiteDatabase db)
{
db.execSQL(DICTIONARY_TABLE_CREATE);
}
}
然後,用SQLiteOpenHelper的實作類別的構造器來擷取一個執行個體。分別調用getWritableDatabase()方法和getReadableDatabase()方法來分別讀寫資料庫。它們都會返回一個SQLiteDatabase對象,它代表了資料庫,並提供了操作SQLite的方法。
使用SQLiteDatabase.query()來執行SQLite的查詢操作,它接收各種查詢參數,如要查詢的表、投影、選擇條件、列、分組等等。對於複雜的查詢,如要求列別名的查詢,應該使用SQLiteQueryBuilder類,它為構建查詢提供了幾種便利的方法。
每個SQLite查詢都會返回一個Cursor對象,它指向查詢結果的所有行。Cursor對象始終能夠在資料庫的查詢結果中導航,並且能夠讀取當前行和列的資料。
資料庫調試
Android SDK包括了sqlite3資料庫工具,可以用這些工具來瀏覽表的內容,運行SQL命令,以及執行其他的SQLite資料上的功能。
使用網路連接
在網路可用時,可以基於Web服務來儲存和擷取資料。使用下列包中的類來進行網路操作。
java.net.*;
android.net.*