當應用繼承contentprovider類,並重寫該類用於提供資料和儲存資料的方法,就可以向其他應用共享其資料。以前我們學習過檔案的操作模式,通過指定檔案的操作模式為context.mode_world_readable 或context.mode_world_writeable同樣可以對外共享資料,但資料的訪問方式會因資料儲存的方式而不同,如:採用xml檔案對外共享資料,需要進行xml解析來讀寫資料;採用sharedpreferences共享資料,需要使用sharedpreferences api讀寫資料。而使用contentprovider共享資料的好處是統一了資料訪問方式。
當應用需要通過contentprovider對外共享資料時:
第一步需要繼承contentprovider並重寫下面方法:
public class personcontentprovider extends contentprovider
第二步需要在androidmanifest.xml使用對該contentprovider進行配置,為了能讓其他應用找到該contentprovider , contentprovider 採用了authorities(主機名/網域名稱)對它進行唯一標識,你可以把 contentprovider看作是乙個**(想想,**也是提供資料者),authorities 就是他的網域名稱:
urimatcher類使用介紹
因為uri代表了要操作的資料,所以我們經常需要解析uri,並從uri中獲取資料。android系統提供了兩個用於操作uri的工具類,分別為urimatcher 和contenturis 。掌握它們的使用,會便於我們的開發工作。
urimatcher類用於匹配uri,它的用法如下:
首先第一步把你需要匹配uri路徑全部給註冊上,如下:
//常量urimatcher.no_match表示不匹配任何路徑的返回碼
urimatcher smatcher = new urimatcher(urimatcher.no_match);
//如果match()方法匹配content:路徑,返回匹配碼為1
smatcher.adduri(「cn.itcast.provider.personprovider」, 「person」, 1);//新增需要匹配uri,如果匹配就會返回匹配碼,其中第乙個引數為主機名
//如果match()方法匹配content:/230路徑,返回匹配碼為2
smatcher.adduri(「cn.itcast.provider.personprovider」, 「person/#」, 2);//#號為萬用字元
switch (smatcher.match(uri.parse("content:/10"
)))
註冊完需要匹配的uri後,就可以使用smatcher.match(uri)方法對輸入的uri進行匹配,如果匹配就返回匹配碼,匹配碼是呼叫adduri()方法傳入的第三個引數,假設匹配content:路徑,返回的匹配碼為1
contenturis類使用介紹
contenturis類用於獲取uri路徑後面的id部分,它有兩個比較實用的方法:
uri uri = uri.parse("content:")
//生成後的uri為:content:/10
parseid(uri)方法用於從路徑中獲取id部分:
uri uri = uri.parse("content:/10")
long personid = contenturis.parseid(uri);//獲取的結果為:10
下面是乙個範例,必須寫在應用的同乙個包裡或者其子包裡:
public class personprovider extends contentprovider
//刪除person表中的所有記錄 /person
//刪除person表中指定id的記錄 /person/10
public int delete(uri uri, string selection, string selectionargs)
count = db.delete("person", where, selectionargs);
return count;
default:
throw new illegalargumentexception("unkwon uri:"+ uri.tostring());}}
@override
public string gettype(uri uri)
}default:
throw new illegalargumentexception("unkwon uri:"+ uri.tostring());}}
@override
public boolean oncreate()
//查詢person表中的所有記錄 /person
//查詢person表中指定id的記錄 /person/10
@override
public cursor query(uri uri, string projection, string selection,
string selectionargs, string sortorder)
return db.query("person", projection, where, selectionargs, null, null, sortorder);
default:
throw new illegalargumentexception("unkwon uri:"+ uri.tostring());}}
//更新person表中的所有記錄 /person
//更新person表中指定id的記錄 /person/10
@override
public int update(uri uri, contentvalues values, string selection, string selectionargs)
count = db.update("person", values, where, selectionargs);
return count;
default:
throw new illegalargumentexception("unkwon uri:"+ uri.tostring());}}
如何建立自己的contentprovider
如何建立自己的contentprovider 作為androidl四大元件 compenent activity,service,breadcasereceiver,contentprovider 之一的content provider,為其它應用程式 也可以是提供該 content provide...
安卓四大元件之ContentProvider
contentprovider是內容提供者 為什麼要有內容提供者?因為在安卓中每乙個應用的資料庫檔案都是私有的,自能在自己的應用中自己使用,別的應用要是想訪問,那麼就需要修改檔案的許可權,這樣資料就變的不安全了,所以就引入了內容提供者。首先來說一下內容提供者中的乙個重要的類uri,熟悉uri會使我們...
8 四大元件之三 ContentProvider
課程目標 理解contentprovider的作用及好處 認清contentprovider與資料儲存的關係 掌握contentprovider對外提供的資料模型形式 能夠編寫contentresolver的增刪改查 能夠自定義乙個contentprovider 能夠提供程序間訪問 了解conten...