ContentProvider

1然评、ContentProvider配置

1.1 自定義類繼承于ContentProvider档冬,實現(xiàn)要求的方法鹉动。

Androidstudio:new->other->ContentProvider

1.2 在配置文件中通過provider標簽配置含衔,通過android:name屬性指定待配置的類矾瘾,通過android:authorities屬性授權懈玻,指定當前內容提供者的URI標識巧婶,必須唯一。

<provider
android:name = ".MyContentProvider"
android:authorities = "com.example.mycontentprovider"
android:enabled = "true"
android:exported = "true"></provider>

1.3 在別的應用中想要獲取ContentProvider的內容涂乌,就需要用到ContentResolver類艺栈。

ContentResolver resolver;
....
//獲取ContentResolver對象
resolver = getContentResolver();
// resolver.query();
resolver.insert();//這里的方法最終會調用目標ContentProvider中的同名insert方法
// resolver.delete();
// resolver.update();

2、ContentProvider中的常用方法

2.1 onCreate():

用于在ContentProvider創(chuàng)建時調用骂倘,對于ContentProvider而言眼滤,無論數(shù)據(jù)的來源是什么,他都認為是種表历涝,然后把數(shù)據(jù)組織成表格诅需,以操作數(shù)據(jù)庫表的形式操作這些數(shù)據(jù)。所以要在OnCreate方法里新建一張數(shù)據(jù)庫表荧库。
//1堰塌、直接傳文件名稱是默認存儲在私有目中,別的應用只有通過ContentProvider才能訪問
SQLiteOpenHelper helper = new SQLiteOpenHelper(getContext(), "stu.db", null, 1) {
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table info_tb (_id integer primary key autoincrement," +
"name varchar(20)," +
"age integer," +
"gender varchar(2))";
db.execSQL(sql);
}

2.2 insert():

用于向ContentProvider的提供方中插入數(shù)據(jù)分衫,需要定義插入的數(shù)據(jù)场刑,那么先來看一下insert方法的參數(shù):
Uri uri=resolver.insert(Uri.parse("..."),values);
ContentResolver.insert()方法的返回值是一個Uri對象,方法里面的參數(shù)有兩個

  • 參數(shù)1:URL對象,content://authorities/path蚪战,如:content://com.example.mycontentprovider
  • 其中牵现,Uri.parse方法是用于將字符串解析成Uri對象的方法铐懊。
  • 參數(shù)2:ContentValues對象,這是一種只能存儲基本數(shù)據(jù)類型的機制瞎疼,并且是以鍵值對的方式存儲的
    上面提到需要定義插入的數(shù)據(jù)是ContentValues對象科乎,那么首先需要先實例化一個ContentValues類的對象:
    ContentValues values=new ContentValues();
    這里要注意的是,存儲的數(shù)據(jù)是以鍵值對的形式存在的贼急,這里的鍵名應該和上面定義的數(shù)據(jù)庫表的列名一致:
    values.put("name",name);
    values.put("age",age);
    values.put("gender",gender);
    注意:這里的insert()方法實際上調用了ContentProvider中的insert方法茅茂,所以我們要重寫ContentProvider的insert()方法,以使得我們傳過去的values能夠插入到數(shù)據(jù)庫表中太抓,關鍵部分代碼如下:
    @Override
    public Uri insert(Uri uri, ContentValues values) {
    long id=db.insert("info_tb",null,values);
    return ContentUris.withAppendedId(uri,id);//該方法把id追加到Uri后面
    }

    這里的返回值實際上還會傳回給ContentResolver空闲,可以選則用ContentUris這個工具類的withAppendedId(Uri contentUri, long id)方法,這個方法負責把id和contentUri連接成一個新的Uri走敌。比如在我們這個例子當中是這么使用 的:ContentUris.withAppendedId (uri,id)碴倾。如果Id為100的話,那么現(xiàn)在的這個Uri的內容就是:
    content://com.example.mycontentprovider/100
    在ContentResolver中悔常,可以使用ContentUris工具類的parseId()方法來把contenUri 后邊的id解析出來影斑。

2.3 query():

首先给赞,重寫ContentProvider中的query方法机打,因為實際上ContentResolver方法中的query方法是調用的這個方法:
Cursor c=db.query("info_tb",projection,selection,selectionArgs,null,null,sortOrder);
再來看下ContentResolver方法中的query方法:
Cursor c=resolver.query(Uri.parse("content://com.example.mycontentprovider"),
null,null,null,null);
這個方法參數(shù)有很多:

  • 參數(shù)1:要訪問的ContentProvider的唯一標識符
  • 數(shù)2:查詢哪些列(如果查詢所有列,就是null)
  • 參數(shù)3:查詢條件(where)
  • 參數(shù)4:條件值重寫ContentProvider中的query方法片迅,因為實際上ContentResolver方法中的query方法是調用的這個方法:
  • 參數(shù)5:按什么排序
    要把查詢到的結果展示在ListView残邀,需要定義適配器,這里的查詢結果是存儲在Cursor中的柑蛇,所以采用SimpleCursorAdapter這個游標適配器:
    SimpleCursorAdapter adapter=new SimpleCursorAdapter(this, R.layout.item, c,
    new String[]{"_id", "name", "age", "gender"},
    new int[]{R.id.id_item, R.id.name_item, R.id.age_item, R.id.gender_item}, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

mListView.setAdapter(adapter);
SimpleCursorAdapter的參數(shù)有很多:

  • 參數(shù)1:當前環(huán)境
  • 參數(shù)2:ListView所引用的布局(裝載數(shù)據(jù)的列表項)
  • 參數(shù)3:數(shù)據(jù)源
  • 參數(shù)4:Cursor里面數(shù)據(jù)每一列的列名組成的字符串數(shù)組
  • 參數(shù)5:對應列的id(要把什么類型的數(shù)據(jù)放入什么地方)形成的數(shù)組
  • 參數(shù)6:設置及時把更新過的數(shù)據(jù)顯示在列表上

delete():

首先芥挣,先重寫ContentProvider中的delete方法,因為實際上ContentResolver方法中的delete方法是調用的這個方法:
int result=db.delete("info_tb",selection,selectionArgs);
return result;
這里的參數(shù)有三個:
參數(shù)1:表名
參數(shù)2:條件
參數(shù)3:條件值組成的數(shù)組
Result的返回值為1耻台,說明刪除成功空免,否則說明刪除失敗
接下來再來看下ContentResolver方法中的delete方法
resolver.delete(Uri.parse("content://com.example.mycontentprovider"), "_id=?", new String[]{_id});
這里的參數(shù)有三個:
參數(shù)1:ContentProvider的唯一標識符
參數(shù)2:條件
參數(shù)3:條件值組成的數(shù)組

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盆耽,隨后出現(xiàn)的幾起案子蹋砚,更是在濱河造成了極大的恐慌,老刑警劉巖摄杂,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坝咐,死亡現(xiàn)場離奇詭異,居然都是意外死亡析恢,警方通過查閱死者的電腦和手機墨坚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來映挂,“玉大人泽篮,你說我怎么就攤上這事盗尸。” “怎么了帽撑?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵振劳,是天一觀的道長。 經(jīng)常有香客問我油狂,道長历恐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任专筷,我火速辦了婚禮弱贼,結果婚禮上,老公的妹妹穿的比我還像新娘磷蛹。我一直安慰自己吮旅,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布味咳。 她就那樣靜靜地躺著庇勃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪槽驶。 梳的紋絲不亂的頭發(fā)上责嚷,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音掂铐,去河邊找鬼罕拂。 笑死,一個胖子當著我的面吹牛全陨,可吹牛的內容都是我干的爆班。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辱姨,長吁一口氣:“原來是場噩夢啊……” “哼柿菩!你這毒婦竟也來了?” 一聲冷哼從身側響起雨涛,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤枢舶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后镜悉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祟辟,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年侣肄,在試婚紗的時候發(fā)現(xiàn)自己被綠了旧困。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吼具,靈堂內的尸體忽然破棺而出僚纷,到底是詐尸還是另有隱情,我是刑警寧澤拗盒,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布怖竭,位于F島的核電站,受9級特大地震影響陡蝇,放射性物質發(fā)生泄漏痊臭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一登夫、第九天 我趴在偏房一處隱蔽的房頂上張望广匙。 院中可真熱鬧,春花似錦恼策、人聲如沸鸦致。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽分唾。三九已至,卻和暖如春狮斗,著一層夾襖步出監(jiān)牢的瞬間绽乔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工情龄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留迄汛,地道東北人捍壤。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓骤视,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鹃觉。 傳聞我的和親對象是個殘疾皇子专酗,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354