標籤:讀取連絡人 next argument text values 讀取 set onchange 標籤
內容提供者(掌握)
- 應用的資料庫是不允許其他應用訪問的
- 內容提供者的作用就是讓別的應用訪問到你的私人資料
自訂內容提供者,繼承ContentProvider類,重寫增刪改查方法,在方法中寫增刪改查資料庫的代碼,舉例增方法
@Overridepublic Uri insert(Uri uri, ContentValues values) { db.insert("person", null, values); return uri;}
在資訊清單檔中定義內容提供者的標籤,注意必須要有authorities屬性,這是內容提供者的主機名稱,功能類似地址
<provider android:name="com.itheima.contentprovider.PersonProvider" android:authorities="com.itheima.person" android:exported="true" ></provider>
建立一個其他應用,訪問自訂的內容提供者,實現對資料庫的插入操作
public void click(View v){ //得到內容分解器對象 ContentResolver cr = getContentResolver(); ContentValues cv = new ContentValues(); cv.put("name", "小方"); cv.put("phone", 138856); cv.put("money", 3000); //url:內容提供者的主機名稱 cr.insert(Uri.parse("content://com.itheima.person"), cv);}
UriMatcher(掌握)
- 用於判斷一條uri跟指定的多條uri中的哪條匹配
添加匹配規則
//指定多條urium.addURI("com.itheima.person", "person", PERSON_CODE);um.addURI("com.itheima.person", "company", COMPANY_CODE);//#號可以代表任一數字um.addURI("com.itheima.person", "person/#", QUERY_ONE_PERSON_CODE);
通過Uri匹配器可以實現操作不同的表
@Overridepublic Uri insert(Uri uri, ContentValues values) { if(um.match(uri) == PERSON_CODE){ db.insert("person", null, values); } else if(um.match(uri) == COMPANY_CODE){ db.insert("company", null, values); } else{ throw new IllegalArgumentException(); } return uri;}
如果路徑中帶有數字,把數字提取出來的api
int id = (int) ContentUris.parseId(uri);
簡訊資料庫(掌握)
- 只需要關注sms表
- 只需要關注4個欄位
- body:簡訊內容
- address:簡訊的寄件者或收件者號碼(跟你聊天那哥們的號碼)
- date:簡訊時間
- type:1為收到,2為發送
讀取系統簡訊,首先查詢源碼獲得簡訊資料庫內容提供者的主機名稱和路徑,然後訪問內容提供者(掌握)
ContentResolver cr = getContentResolver(); Cursor c = cr.query(Uri.parse("content://sms"), new String[]{"body", "date", "address", "type"}, null, null, null); while(c.moveToNext()){ String body = c.getString(0); String date = c.getString(1); String address = c.getString(2); String type = c.getString(3); System.out.println(body+";" + date + ";" + address + ";" + type); }
插入系統簡訊(熟悉)
ContentResolver cr = getContentResolver(); ContentValues cv = new ContentValues(); cv.put("body", "您尾號為XXXX的招行儲蓄卡收到轉賬1,000,000人民幣"); cv.put("address", 95555); cv.put("type", 1); cv.put("date", System.currentTimeMillis()); cr.insert(Uri.parse("content://sms"), cv);
連絡人資料庫(掌握)
- raw_contacts表:
- data表:連絡人的具體資訊,一個資訊佔一行
- data1:資訊的具體內容
- raw_contact_id:連絡人id,描述資訊屬於哪個連絡人
- mimetype_id:描述資訊是屬於什麼類型
- mimetypes表:通過mimetype_id到該表查看具體類型
讀取連絡人(掌握)
先查詢raw_contacts表拿到連絡人id
Cursor cursor = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"contact_id"}, null, null, null);
然後拿著連絡人id去data表查詢屬於該連絡人的資訊
Cursor c = cr.query(Uri.parse("content://com.android.contacts/data"), new String[]{"data1", "mimetype"}, "raw_contact_id = ?", new String[]{contactId}, null);
得到data1欄位的值,就是連絡人的資訊,通過mimetype判斷是什麼類型的資訊
while(c.moveToNext()){ String data1 = c.getString(0); String mimetype = c.getString(1); if("vnd.android.cursor.item/email_v2".equals(mimetype)){ contact.setEmail(data1); } else if("vnd.android.cursor.item/name".equals(mimetype)){ contact.setName(data1); } else if("vnd.android.cursor.item/phone_v2".equals(mimetype)){ contact.setPhone(data1); }}
插入連絡人(熟悉)
內容觀察者(掌握)
當資料庫資料改變時,內容提供者會發出通知,在內容提供者的uri上註冊一個內容觀察者,就可以收到資料改變的通知
cr.registerContentObserver(Uri.parse("content://sms"), true, new MyObserver(new Handler()));class MyObserver extends ContentObserver{ public MyObserver(Handler handler) { super(handler); // TODO Auto-generated constructor stub } //內容觀察者收到資料庫發生改變的通知時,會調用此方法 @Override public void onChange(boolean selfChange) { }}
在內容提供者中發通知的代碼
ContentResolver cr = getContext().getContentResolver();//發出通知,所有註冊在這個uri上的內容觀察者都可以收到通知cr.notifyChange(uri, null);
Android基礎總結(十)