內容提供者ContentProvider

2021-07-26 16:42:09 字數 3720 閱讀 1446

contentprovider 在android中的作用是對外共享資料,也就是說你可以通過contentprovider把應用中的資料共享給其他應用訪問,其他應用可以通過contentprovider 對你應用中的資料進行添刪改查。關於資料共享,以前我們學習過檔案操作模式,知道通過指定檔案的操作模式為context.mode_world_readable 或context.mode_world_writeable同樣也可以對外共享資料。那麼,這裡為何要使用contentprovider 對外共享資料呢?是這樣的,如果採用檔案操作模式對外共享資料,資料的訪問方式會因資料儲存的方式而不同,導致資料的訪問方式無法統一,如:採用xml檔案對外共享資料,需要進行xml解析才能讀取資料;採用sharedpreferences共享資料,需要使用sharedpreferences api讀取資料。

使用contentprovider對外共享資料的好處是統一了資料的訪問方式。

contentprovider的原理是按照一定規則暴露自己的介面給其它應用來訪問自己應用的資料(其實就是自定義增刪改查介面並暴露出去,讓別的應用訪問自己的資料)。

contentresolver就是按照一定規則訪問內容提供者的資料(其實就是呼叫內容提供者自定義的介面來操作它的資料)。

1. 定義乙個類 繼承 contentprovider

2. 定義匹配規則 指定主機名 + path  code    urimatcher  content:// 

3. 通過靜態**塊新增匹配規則 

4. 一定要記得在清單檔案配置內容提供者 不要忘記加authorities 

說明:第一步繼承contentprovider需要重寫下面方法:

public class personcontentprovider extends contentprovider

第四步需要在androidmanifest.xml使用對該contentprovider進行配置,為了能讓其他應用找到該contentprovider , contentprovider 

採用了authorities(主機名/網域名稱)對它進行唯一標識,你可以把 contentprovider看作是乙個**(想想,**也是提供資料者),authorities 就是他的網域名稱:

public boolean oncreate()

該方法在contentprovider建立後就會被呼叫, android開機後, contentprovider在其它應用第一次訪問它時才會被建立。

public uri insert(uri uri, contentvalues values)

該方法用於供外部應用往contentprovider新增資料。

public int delete(uri uri, string selection, string selectionargs)

該方法用於供外部應用從contentprovider刪除資料。

public int update(uri uri, contentvalues values, string selection, string selectionargs)

該方法用於供外部應用更新contentprovider中的資料。

public cursor query(uri uri, string projection, string selection, string selectionargs, string sortorder)

該方法用於供外部應用從contentprovider中獲取資料。

public string gettype(uri uri)

該方法用於返回當前url所代表資料的mime型別。如果操作的資料屬於集合型別,那麼mime型別字串應該以vnd.android.cursor.dir/開頭,

例如:要得到所有person記錄的uri為content:那麼返回的mime型別字串應該為:「vnd.android.cursor.dir/person」。如果要操作的資料屬於非集合型別資料,那麼mime型別字串應該以vnd.android.cursor.item/開頭,例如:得到id為10的person記錄,uri為content:那麼返回的mime型別字串應該為:「vnd.android.cursor.item/person」。

mycontentprovider
內容提供者的**如下:

package com.example.provider;

import android.content.contentprovider;

import android.content.contentvalues;

import android.content.urimatcher;

import android.database.cursor;

import android.database.sqlite.sqlitedatabase;

import android.net.uri;

import android.support.annotation.nullable;

import android.util.log;

import com.example.util.dbutil;

public class mycontentprovider extends contentprovider

@nullable

@override

public cursor query(uri uri, string strings, string s, string strings1, string s1)

@nullable

@override

public string gettype(uri uri)

@nullable

@override

public uri insert(uri uri, contentvalues contentvalues)

@override

public int delete(uri uri, string s, string strings)

@override

public int update(uri uri, contentvalues contentvalues, string s, string strings)

}

清單檔案配置內容提供者

db如下

package com.example.util;

import android.content.context;

import android.database.sqlite.sqlitedatabase;

import android.database.sqlite.sqliteopenhelper;

import android.util.log;

public class dbutil extends sqliteopenhelper

//建立表的操作

//呼叫一次

@override

public void oncreate(sqlitedatabase sqlitedatabase)

//upload

//download

//資料庫版本: 低---高

@override

public void onupgrade(sqlitedatabase sqlitedatabase, int i, int i1)

}

內容提供者

public class personcontentprovider extends contentprovider override public boolean oncreate 作用 判斷 傳進來的 uri 查詢的是一條資料 還是多條資料 override public string gett...

內容提供者

package com.xh.tx.utils import android.content.context import android.database.sqlite.sqlitedatabase import android.database.sqlite.sqlitedatabase.cur...

內容提供者

讀取系統簡訊,首先查詢原始碼獲得簡訊資料庫內容提供者的主機名和路徑,然後 contentresolver cr getcontentresolver cursor c cr.query uri.parse content sms new string,null,null,null while c.m...