當一個應用程序在Android中安裝后,我們在使用應用的過程中會產生很多的數據,應用都有自己的數據,那么我們應該如何存儲數據呢?
數據存儲方式
Android 的數據存儲有5種方式:
1. SharedPreferences存儲數據
SharedPreferences數據存儲,也叫作xml存儲。這是將數據存儲“data/data/程序包名/share_prefs”路徑下的到xml文件中。
相關連接: 《Android中數據存儲——SharedPreferences存儲數據 》
2. 文件存儲數據
分為內部儲存和外部存儲。內部存儲是應用程序使用Android為自己分配的內存空間,數據存儲到“/data/data/程序包名/files”路徑下的相應文件中。外部存儲是使用手機sdcard的內存(這個sdcard並不是我們經常說的那個可以拆卸替換的SD卡,那個SD卡我們稱之為擴展卡),使用這部分內存要聲明相應的權限。
相關連接:《Android中數據存儲——文件存儲數據 》
3. SQLite數據庫存儲數據
使用數據庫進行存儲,這個一般數據量比較大的時候。
相關連接:《Android中數據存儲——SQLite數據庫存儲數據 》
4. 使用ContentProvider存儲數據
這個比較眼熟,ContentProvider也是Android的四大組件之一。ContentProvider一般是第三方提供的數據存儲方式,向我們手機中的通訊錄聯系人,照片,音樂等……
相關連接:《Android中數據存儲——ContentProvider存儲數據》
5. 網絡存儲數據
這個是將數據上傳到網絡上進行存儲。
下面進入我們今天的主要內容,使用ContentProvider存儲數據。
ContentProvider存儲數據
ContentProvider內容提供器,主要用於在不同應用程序之間實現數據的共享功能。舉例來說,我們開發一個應用程序,我們不可能只使用自己的數據,也會用到其他應用的數據,像手機中的通訊錄聯系人,圖片,音樂等是使用到最多的。我們使用的SharedPreferences,文件存儲以及數據庫SQLite都是從存儲的應用內部的數據,實現不同應用間的數據共享就要使用到ContentProvider。
ContentProvider使用方法有兩種:一種是使用現有的內容提供器來讀取和操作相應程序中的數據;另一種是創建自己的內容提供器給我們的應用提供外部訪問接口。
這里我們只講解使用已有的內容提供器來讀取和操作相應程序的數據。
ContentResolver的使用
想要訪問內容提供器中的內容我們需要借助ContentResolver類。
ContentResolver為我們提供了”增“insert(Uri url, ContentValues values),“刪”delete(Uri url, String where, String[] selectionArgs),“改”update(Uri uri, ContentValues values, String where, String[] selectionArgs),“查”query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)方法對內容提供器中的內容進行操作,是不是很眼熟,對啊,和SQLiteDatabase中的增刪改查操作是一樣的,在此我們不再具體描述。
Uri的使用
在SQLiteDatabase中,對數據庫的操作是通過接受數據庫的表名進行操作的,而在ContentResolver中是不接受表名的,而接受Uri對象。通過Uri指定操作的內容“位置”。
Uri由兩部分組成:權限和路徑。權限是對於不同的應用程序進行區分的,一般用應用程序的包名;路徑是對於同一應用程序的不同表進行區分的。例如,我們有一個應用程序的包名是“com.example.ontentproviderdemo”,應用程序中有一個表“table”,則Uri為:“content://com.example.ontentproviderdemo/table”。我們通過parse()方法將其解析為Uri便可以使用了。
1 Uri uri = Uri.parse.("content://com.example.ontentproviderdemo/table");
查詢通訊錄
我們以查詢通訊錄中的內容為例,看一下ContentProvider的使用。通過Android提供的ContentProvider內容提供器訪問通訊錄中的聯系人數據。
1. 讀取聯系人是需要權限的,首先在AndroidManifext中加入權限:
1 <!--允許讀取通訊錄 --> 2 <uses-permission android:name="android.permission.READ_CONTACTS"/>
2. 創建ContentResolver對象對ContentProvider進行操作。
3. 創建一個Uri對象,指定訪問通訊錄。這里我們使用Android已經解析好的Uri即可:ContactsContract.CommonDataKinds.Phone.CONTENT_URI
4. 查找聯系人內容使用ContentResolver的query()方法,返回一個Cursor對象。
1 Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 2 Cursor cursor = contentResolver.query(uri, new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER}, null, null, null); 3 cursor.moveToFirst(); 4 while (!cursor.isAfterLast()) { 5 String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 6 String num = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 7 Log.d("data", "聯系人姓名:" + name + ", 電話:" + num); 8 cursor.moveToNext(); 9 }
通訊錄內容:
讀取結果: