日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android学习日记13--数据存储之ContentProvide

發布時間:2023/12/10 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android学习日记13--数据存储之ContentProvide 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

3、ContentProvider
  數據在Android當中是私有的,當然這些數據包括文件數據和數據庫數據以及一些其他類型的數據。ContentProvider實現多應用程序間的數據共享類
一般利用ContentProvider為需要共享的數據定義一個URI(統一資源定位符)
然后其他程序通過Context獲得ContentResolver并將數據的URI傳入即可

Android已為一些常用的數據創建ContentProvider,這些ContentProvider位于
android.provider包下,常用的就是手機上聯系人信息,但是要取得相應的權限自己的應用程序才能訪問
具體設置是在AndroidManifest.xml

1 <uses-permission android:name="android.permission.READ_CONTACTS" />

對于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

1 public class MyProvider extends ContentProvider { 2 3 @Override 4 public int delete(Uri arg0, String arg1, String[] arg2) { 5 // TODO Auto-generated method stub 6 return 0; 7 } 8 9 @Override 10 public String getType(Uri arg0) { 11 // TODO Auto-generated method stub 12 return null; 13 } 14 15 @Override 16 public Uri insert(Uri arg0, ContentValues arg1) { 17 // TODO Auto-generated method stub 18 return null; 19 } 20 21 // 創建數據庫,建表和插入數據 22 @Override 23 public boolean onCreate() { 24 // TODO Auto-generated method stub 25 SQLiteDatabase db =this.getContext().openOrCreateDatabase("mydb.db", Context.MODE_PRIVATE, null); 26 db.execSQL("create table tab(_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)"); 27 ContentValues values =new ContentValues(); 28 values.put("name", "Hello ContentProvider!"); 29 db.insert("tab", "_id", values); 30 db.close(); 31 return true; 32 } 33 34 // 查詢 35 @Override 36 public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3, 37 String arg4) { 38 // TODO Auto-generated method stub 39 SQLiteDatabase db =this.getContext().openOrCreateDatabase("mydb.db", Context.MODE_PRIVATE, null); 40 Cursor c = db.query("tab", null, null, null, null, null,null); 41 return c; 42 } 43 44 @Override 45 public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) { 46 // TODO Auto-generated method stub 47 return 0; 48 }

?這里為了演示方便只實現創建和查詢兩個簡單的方法

?

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。