Android是基于Linux系統(tǒng),每個用戶有獨立的進程,這些進程之間是不能互相訪問的,如果有需要在各個用戶之間共享數(shù)據(jù),我們需要使用CotentProivder實現(xiàn)。另外,ContentProvider可以提供一個統(tǒng)一的接口使上層調(diào)用者不用關(guān)心數(shù)據(jù)存儲的細(xì)節(jié)問題。
成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的高坪網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!URI
content:// com.anjoyo.myfirstprovider/mitt/12
----A-----|-----------B--------------|--C--|D
A.標(biāo)準(zhǔn)前綴表明這個數(shù)據(jù)被一個內(nèi)容提供器所控制。
B.URI的權(quán)限部分;它標(biāo)識這個內(nèi)容提供器。對于第三方應(yīng)用程序,這應(yīng)該是一個全稱類名以確保唯一性。權(quán)限在
C.用來判斷請求數(shù)據(jù)類型的路徑。這可以是0或多個段長。這個分段可以沒有。
D.被請求的特定記錄的ID,如果有的話。這是被請求記錄的_ID數(shù)值。如果這個請求不局限于單個記錄, 這個分段和尾部的斜線會被忽略。
-----------
每一個ContentProvider都擁有一個公共的URI,這個URI用于表示這個ContentProvider所提供的數(shù)據(jù)。
Android所提供的ContentProvider都存放在android.provider包當(dāng)中。
-----------
ContentProvider的函數(shù)
query() 查詢
insert() 插入
update() 更新
delete() 刪除
getType() 得到數(shù)據(jù)類型
onCreate() 創(chuàng)建時的回調(diào)函數(shù)
------------
實現(xiàn)ContentProvider過程
1.定義一個類,繼承ContentProvider
2.定義一個CONTENT_URI常量
3.實現(xiàn)query,insert,update,delete,getType和onCreate方法
4.在AndroidManifest.xml中聲明
---------------
Uri insertedUri = ContentUris.withAppendedId(uri, rowId);
重新構(gòu)建一個URI對象,如果uri是content://contacts/people,
rowId是45。重新構(gòu)建的URI是content://contacts/people/45
getContext().getContentResolver().notifyChange(insertedUri, null);
notifyChange()方法則用來通知注冊在此URI上的觀察者(observer)數(shù)據(jù)發(fā)生了改變。最后返回刪除或修改數(shù)據(jù)的行數(shù)。
ContentUris是Uri的工具類。其主要方法有:
1):把id拼接到Uri上,然后生成新的Uri
Uri insertUri = ContentUris.withAppendedId(uri,id);
2)解析Uri的id部分
long id = ContentUris.parseId(uri);
另外:uri有個方法是getPathSegments()是獲取uri的每一部分,返回值是List
List
System.out.println(list);
String idstr = list.get(list.size()-1);
long id = Long.parseLong(idstr);
//等價于下邊代碼
long id = ContentUris.parseId(uri);
-------------------------
如何訪問ContentProvider?
step1.獲取ContentResolver對象
ContentResolver cr = mContent.getContentResolver();
Cursor c = cr.query(Uri,...);
Uri insertedUri = cr.insert(Uri,...);
...
SqliteQueryBuilder使用。它是在查詢時候,可以靈活添加查詢條件。不能執(zhí)行添加更新等操作。
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder builder= new SQLiteQueryBuilder();
switch (uriMatcher.match(uri)) {
case PERSONS:
builder.setTables("mitt_tb");
break;
case PERSON:
builder.setTables("mitt_tb");
long id = ContentUris.parseId(uri);
//添加查詢條件 builder.appendWhere("id="+id);
break;
}
SQLiteDatabase db= helper.getReadableDatabase();
Cursor c= builder.query(db, projection, selection, selectionArgs, null, null, sortOrder);
return c;
}