android学习日记13--数据存储之ContentProvide
3、ContentProvider
數據在Android當中是私有的,當然這些數據包括文件數據和數據庫數據以及一些其他類型的數據。ContentProvider實現多應用程序間的數據共享類
一般利用ContentProvider為需要共享的數據定義一個URI(統一資源定位符)
然后其他程序通過Context獲得ContentResolver并將數據的URI傳入即可
Android已為一些常用的數據創建ContentProvider,這些ContentProvider位于
android.provider包下,常用的就是手機上聯系人信息,但是要取得相應的權限自己的應用程序才能訪問
具體設置是在AndroidManifest.xml
對于ContentProvide重要的是數據模型和URI
數據模型:ContentProvide為所需要的數據創建表,每行代表一條記錄,每條記錄有唯一的'_ID'標識
URI:每個ContentProvide對外提供一個URI來標識自己的數據集
URI特點:
1、無法改變的標準前綴,包括;"content://"、"tel://"等。當前綴是"content://"時,說明通過一個Content Provider控制這些數據
2、URI的標識,它通過authorities屬性聲明,用于定義了是哪個ContentProvider提供這些數據。對于第三方應用程序,為了保證URI標識的唯一性,它必須是一個完整的類名(數據路徑)。例如;"content://com.example.contentprovide.myprovider"
3、如果URI中包含表示需要獲取的記錄的_ID;則就返回該id對應的數據,如果沒有_ID,就表示返回全部
舉個例子,如:?
所有聯系人的URI: content://contacts/people
某個聯系人的URI: content://contacts/people/5
?
具體使用步驟:
1、在當前應用程序中定義一個ContentProvider
?這里為了演示方便只實現創建和查詢兩個簡單的方法
?
2、在當前應用程序的AndroidManifest.xml中注冊此ContentProvider
1 <provider android:name=".MyProvider" android:authorities="com.example.contentprovider.MyProvider"/>?
3、其他應用程序通過ContentResolver和Uri來獲取此ContentProvider的數據
1 protected void onCreate(Bundle savedInstanceState) { 2 super.onCreate(savedInstanceState); 3 setContentView(R.layout.activity_main); 4 5 // 獲取當前context 6 Context context = MainActivity.this; 7 8 // 得到ContentResolver對象 9 ContentResolver resolver = context.getContentResolver(); 10 11 // uri格式 "content://"、數據的路徑、標示ID(可選) 12 Uri uri = Uri.parse("content://com.example.contentprovider.MyProvider"); 13 Cursor c = resolver.query(uri, null, null, null, null); 14 15 // 打印獲取數據 16 c.moveToFirst(); 17 for(int i=0; i<c.getCount(); i++){ 18 int index = c.getColumnIndexOrThrow("name"); 19 String src = c.getString(index); 20 Log.d("", src); 21 c.moveToNext(); 22 } 23 }日志打印:
?
?
上面MyProvider代碼和應用程序MainActivity代碼不放在同一個包下是想說明ContentProvider不同程序間的數據共享,
但是注冊獲取權限那段代碼要放在調用的程序包里。
其實通過代碼可以看出為了共享數據庫.可以讓數據庫披上ContentProvider外衣,主要還是通過SQLiteDatabase去操作數據庫。
當然對于已封裝的共享數據。我們只要設置獲取權限,通過ContentResolver就可以直接調用。
?
4、獲取系統的聯系人、媒體庫信息
對于系統程序的聯系人、多媒體等信息可通過指定的Uri來獲取。
數據附錄是獲取本地聯系人信息代碼:
1 public String getContactInfo(){ 2 String result=""; 3 ContentResolver resolver=getContentResolver(); 4 //查詢聯系人 5 Cursor cursor=resolver.query(Contacts.CONTENT_URI, null, null, null, null); 6 int idIndex=cursor.getColumnIndex(Contacts._ID); 7 // 取得聯系人名字 (顯示出來的名字),實際內容在 ContactsContract.Contacts中 8 int nameIndex=cursor.getColumnIndex(Contacts.DISPLAY_NAME); 9 for (cursor.moveToFirst();(!cursor.isAfterLast());cursor.moveToNext()) { 10 //獲取聯系人ID 11 String contactId =cursor.getString(idIndex); 12 result=result+contactId+"\t\t\t"; 13 result=result+cursor.getString(nameIndex)+"\t\t\t"; 14 // 根據聯系人ID查詢對應的電話號碼 15 Cursor phoneNumbers = resolver.query(CommonDataKinds.Phone.CONTENT_URI, null, 16 CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null); 17 // 取得電話號碼(可能存在多個號碼) 18 while (phoneNumbers.moveToNext()) 19 { 20 String strPhoneNumber = phoneNumbers.getString(phoneNumbers.getColumnIndex(CommonDataKinds.Phone.NUMBER)); 21 result=result+strPhoneNumber+"\t\t\t"; 22 } 23 phoneNumbers.close(); 24 25 // 根據聯系人ID查詢對應的email 26 Cursor emails = resolver.query(CommonDataKinds.Email.CONTENT_URI, null, 27 CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null); 28 // 取得email(可能存在多個email) 29 while (emails.moveToNext()) 30 { 31 String strEmail = emails.getString(emails.getColumnIndex(CommonDataKinds.Email.DATA)); 32 result=result+strEmail+"\t\t\t"; 33 } 34 emails.close(); 35 result=result+"\n"; 36 } 37 cursor.close(); 38 return result; 39 }?
5、監聽ContentProvider的數據改變
隨著ContentProvider的共享數據可能發生改變,要提供給有使用該共享數據的相應,具體步驟如下:
1).在ContentProvider類的insert\update\delete方法加入this.getContext().getContentResolver().notifyChange(URI,null); 其中URI表示監聽的URI null表示發送消息給任何人; 2).在訪問者的類中調用如下方法: context.getContentResolver().registerContentObserver(uri,true,new ContentObserver(new Handler())); 3).創建內部類繼承ContentObserver并重寫下面兩個方法: (1)帶有Handler的構造函數; (2)public void onChange(boolean selfChange); 此函數在內容提供者發出改變信號時就會被調用 參數selfChange為如果是自己改變的原因,則為true;如果不是自己改變的,則為false;?
?
轉載于:https://www.cnblogs.com/aiguozhe/p/3587881.html
總結
以上是生活随笔為你收集整理的android学习日记13--数据存储之ContentProvide的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript实现单击上一张和下一
- 下一篇: Go学习笔记—Channel通道