Android資料存放區(Data Storage)(二)

來源:互聯網
上載者:User

使用外部儲存

每個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.*

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.