欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

【安卓】ContentProvider基礎(chǔ)-創(chuàng)新互聯(lián)

Content Provider介紹Android中的Content Provider機(jī)制可以支持在多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù)。這也是跨應(yīng)用共享數(shù)據(jù)的唯一方式。在android系統(tǒng)中,沒有一個(gè)公共的內(nèi)存區(qū)域,供多個(gè)應(yīng)用共享存儲(chǔ)數(shù)據(jù),要在多個(gè)應(yīng)用中共享數(shù)據(jù),就需要使用Content Provider。
Android提供了一些常用數(shù)據(jù)類型的Contentprovider,比如音頻、視頻、圖片和私人通訊錄等??稍赼ndroid.provider包下面找到一些android提供的Content Provider。
公開應(yīng)用私有數(shù)據(jù)的兩種方式1:創(chuàng)建自己的Content Provider,需要繼承ContentProvider類,讓其他應(yīng)用來訪問自己的Content Provider。
2:把自己的數(shù)據(jù)通過Content Provider添加到其他應(yīng)用中去,這樣所有的應(yīng)用都可以通過那個(gè)Content Provider來訪問這些數(shù)據(jù)。
【安卓】Content Provider 基礎(chǔ)
所有Content Provider都需要實(shí)現(xiàn)相同的接口,通過這個(gè)接口來進(jìn)行數(shù)據(jù)的增加、修改、刪除和查詢的功能。
要使用Content Provider是非常簡(jiǎn)單的,只需要獲得ContentResolver對(duì)象,然后通過這個(gè)對(duì)象進(jìn)行數(shù)據(jù)的CRUD操作。獲得ContentResolver的方式如下:ContentResolver cr = getContentResolver();Android系統(tǒng)負(fù)責(zé)初始化所有的Content Provider,不需要用戶自己去創(chuàng)建。實(shí)際上,Content Provider的用戶都不可能直接訪問到Content Provider實(shí)例,只能通過ContentResolver在中間代理。
Content Provider展示數(shù)據(jù)類似一個(gè)數(shù)據(jù)庫的表。其中:每行有個(gè)值唯一的數(shù)字字段,名為_ID,可用于對(duì)表中指定記錄的定位;Content Provider返回的數(shù)據(jù)結(jié)構(gòu),類似JDBC的ResultSet,在Android中,是Cursor對(duì)象。
【安卓】Content Provider 基礎(chǔ)
理解URI1:每個(gè)Content Provider定義一個(gè)唯一的公開的URI,用于指定到它的數(shù)據(jù)集。一個(gè)Content Provider可以包含多個(gè)數(shù)據(jù)集,這樣,就需要有多個(gè)URI與每個(gè)數(shù)據(jù)集相對(duì)應(yīng)。
2:URI的格式,標(biāo)準(zhǔn)的格式分成了四個(gè)部分,示例如下:
content://    cn.javass.users    /students    /12
(1)content://:標(biāo)準(zhǔn)前綴,用來說明一個(gè)Content Provider控制這些數(shù)據(jù)
(2)cn.javass.users:URI的標(biāo)識(shí),它定義了是哪個(gè)Content Provider的實(shí)現(xiàn)來提供這些數(shù)據(jù)。為了保證URI標(biāo)識(shí)的唯一性,它必須是一個(gè)完整的、小寫的、ContentProvider實(shí)現(xiàn)類名。這個(gè)標(biāo)識(shí)在<provider> 元素的 authorities屬性中說明: <provider name=”.Users”  authorities=”cn.javass.users”>
(3)/students :路徑,Content Provider用來確定當(dāng)前需要什么類型的數(shù)據(jù),URI中可能包括0到多個(gè)路徑
(4)12:具體某條數(shù)據(jù)的標(biāo)識(shí),如果URI中包含,表示需要獲取的記錄的ID;如果沒有ID,就表示返回全部。
ContentResolver的使用1:ContentResolver通過URI來操作ContentProvider提供的數(shù)據(jù)。因此你必須知道要操作數(shù)據(jù)的URI,除此之外,還必須知道要操作的數(shù)據(jù)段的名稱,以及此數(shù)據(jù)段的數(shù)據(jù)類型。如果你想要獲取一個(gè)特定的記錄,你還必須知道此記錄的ID
2: ContentResolver的常用方法是完全類似于數(shù)據(jù)庫操作的,如下:
(1)新增:insert(Uri url, ContentValues values),返回Uri
(2)刪除:delete(Uri url, String where, String[] selectionArgs),返回操作的記錄條數(shù)
(3)修改:update(Uri uri, ContentValues values, String where, String[] selectionArgs) ,返回操作的記錄條數(shù)
(4)查詢:query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder),返回Cursor
創(chuàng)建自己的Content ProviderUriMatcher:用于匹配Uri,基本用法如下:1:注冊(cè)能匹配的Uri
(1)常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼(-1)。
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
(2)如果match()方法匹配某個(gè)路徑,設(shè)置一個(gè)返回的值。
例如匹配content://com.android.calendar/calendars路徑,返回匹配碼為1。uriMatcher.addURI(“content://com.android.calendar”, “calendars”, 1);
(3)如果match()方法匹配某個(gè)URI,設(shè)置一個(gè)返回的值。例如匹配
content://com.android.calendar/calendars/11這個(gè)URI,返回匹配碼為2。uriMatcher.addURI(“content://com.android.calendar”, “calendars/#”, 2);
2:注冊(cè)完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法對(duì)輸入的Uri進(jìn)行匹配,如果匹 配就返回匹配碼。
ContentUris:用于操作Uri路徑后面的ID部分,它有兩個(gè)比較實(shí)用的方法:1:withAppendedId(uri, id)用于為路徑加上ID部分
2:parseId(uri)方法用于從路徑中獲取ID部分
創(chuàng)建自己的Content Provider,基本步驟如下:1:寫一個(gè)類繼承ContentProvider,就需要實(shí)現(xiàn)相應(yīng)的方法
2: Content Provider通常需要對(duì)外提供:CONTENT_URI、URI_AUTHORITY,對(duì)外的數(shù)據(jù)字段常量等,例如:

java代碼:
  1. public static final String URI_AUTHORITY = "cn.javass.mycp";

    元寶山網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)建站從2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站
  2. public static final String URI_PATH = "Users";

  3. public static final String URI_PATH2 = "Users/#";

  4. public static final Uri CONTENT_URI = Uri.parse("content://"

  5. + URI_AUTHORITY + "/" + URI_PATH);

  6. //對(duì)外的數(shù)據(jù)字段

  7. public static final String COLUMN_UUID = "uuid";

  8. public static final String COLUMN_NAME = "name";

復(fù)制代碼

  1. public static final String URI_AUTHORITY = "cn.javass.mycp";

  2. public static final String URI_PATH = "Users";

  3. public static final String URI_PATH2 = "Users/#";

  4. public static final Uri CONTENT_URI = Uri.parse("content://"

  5. + URI_AUTHORITY + "/" + URI_PATH);

  6. //對(duì)外的數(shù)據(jù)字段

  7. public static final String COLUMN_UUID = "uuid";

  8. public static final String COLUMN_NAME = "name";

復(fù)制代碼

3:提供UriMatcher,用來判斷外部傳入的Uri是否帶有id,好區(qū)分處理:
  1. public static final int ALL_RECORDS = 1;

  2. public static final int SINGLE_RECORD = 2;

  3. public static UriMatcher sMatcher = null;

  4. static {

  5. sMatcher = new UriMatcher(UriMatcher.NO_MATCH);

  6. sMatcher.addURI(URI_AUTHORITY, URI_PATH, ALL_RECORDS);

  7. sMatcher.addURI(URI_AUTHORITY, URI_PATH2, SINGLE_RECORD);

  8. }

復(fù)制代碼

  1. public static final int ALL_RECORDS = 1;

  2. public static final int SINGLE_RECORD = 2;

  3. public static UriMatcher sMatcher = null;

  4. static {

  5. sMatcher = new UriMatcher(UriMatcher.NO_MATCH);

  6. sMatcher.addURI(URI_AUTHORITY, URI_PATH, ALL_RECORDS);

  7. sMatcher.addURI(URI_AUTHORITY, URI_PATH2, SINGLE_RECORD);

  8. }

復(fù)制代碼

然后就是根據(jù)自己保存數(shù)據(jù)的具體實(shí)現(xiàn),來實(shí)現(xiàn)Content Provider的方法,這里以前面SQLite的示例來演示如何實(shí)現(xiàn)這些方法。
新增功能的簡(jiǎn)單實(shí)現(xiàn)
java代碼:
  1. public Uri insert(Uri uri, ContentValues values) {

  2. Uri retUri = null;

  3. if(sMatcher.match(uri)==ALL_RECORDS){

  4. //判斷是否需要處理,只有符合的才處理

  5. SQLiteDatabase db = dh.getWritableDatabase();

  6. long id = db.insert("tbl_user",null, values);

  7. retUri = ContentUris.withAppendedId(uri, id);

  8. }

  9. return retUri;

  10. }

復(fù)制代碼

  1. public Uri insert(Uri uri, ContentValues values) {

  2. Uri retUri = null;

  3. if(sMatcher.match(uri)==ALL_RECORDS){

  4. //判斷是否需要處理,只有符合的才處理

  5. SQLiteDatabase db = dh.getWritableDatabase();

  6. long id = db.insert("tbl_user",null, values);

  7. retUri = ContentUris.withAppendedId(uri, id);

  8. }

  9. return retUri;

  10. }

復(fù)制代碼

查詢功能的簡(jiǎn)單實(shí)現(xiàn)java代碼:
  1. public Cursor query(Uri uri, String[] projection, String selection,

  2. String[] selectionArgs, String sortOrder) {

  3. if(sMatcher.match(uri)==ALL_RECORDS){

  4. SQLiteDatabase db = dh.getWritableDatabase();

  5. Cursor c = db.query("tbl_user", projection,

  6. selection,selectionArgs, "", "", sortOrder,"");

  7. return c;

  8. }else if(sMatcher.match(uri)==SINGLE_RECORD){

  9. //這里應(yīng)該處理帶id的uri,省略了.....

  10. }

  11. return null;

  12. }

復(fù)制代碼

  1. public Cursor query(Uri uri, String[] projection, String selection,

  2. String[] selectionArgs, String sortOrder) {

  3. if(sMatcher.match(uri)==ALL_RECORDS){

  4. SQLiteDatabase db = dh.getWritableDatabase();

  5. Cursor c = db.query("tbl_user", projection,

  6. selection,selectionArgs, "", "", sortOrder,"");

  7. return c;

  8. }else if(sMatcher.match(uri)==SINGLE_RECORD){

  9. //這里應(yīng)該處理帶id的uri,省略了.....

  10. }

  11. return null;

  12. }

復(fù)制代碼

修改功能的簡(jiǎn)單實(shí)現(xiàn)
java代碼:
  1. public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {

  2. int ret = 0;

  3. if(sMatcher.match(uri)==ALL_RECORDS){

  4. //判斷是否需要處理,只有符合的才處理

  5. SQLiteDatabase db = dh.getWritableDatabase();

  6. ret = db.update("tbl_user",values,selection, selectionArgs);

  7. }else if(sMatcher.match(uri)==SINGLE_RECORD){//這里應(yīng)該處理帶id的uri,省略了.....}

  8. return ret;

  9. }

復(fù)制代碼

  1. public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {

  2. int ret = 0;

  3. if(sMatcher.match(uri)==ALL_RECORDS){

  4. //判斷是否需要處理,只有符合的才處理

  5. SQLiteDatabase db = dh.getWritableDatabase();

  6. ret = db.update("tbl_user",values,selection, selectionArgs);

  7. }else if(sMatcher.match(uri)==SINGLE_RECORD){//這里應(yīng)該處理帶id的uri,省略了.....}

  8. return ret;

  9. }

復(fù)制代碼

刪除功能的簡(jiǎn)單實(shí)現(xiàn)
java代碼:
  1. public int delete(Uri uri, String selection, String[] selectionArgs) {

  2. int ret = 0;

  3. if(sMatcher.match(uri)==ALL_RECORDS){

  4. //判斷是否需要處理,只有符合的才處理

  5. SQLiteDatabase db = dh.getWritableDatabase();

  6. ret = db.delete("tbl_user", selection, selectionArgs);

  7. }else if(sMatcher.match(uri)==SINGLE_RECORD){//這里應(yīng)該處理帶id的uri,省略了.....}

  8. return ret;

  9. }

復(fù)制代碼

  1. [java] view plaincopy

  2. public int delete(Uri uri, String selection, String[] selectionArgs) {

  3. int ret = 0;

  4. if(sMatcher.match(uri)==ALL_RECORDS){

  5. //判斷是否需要處理,只有符合的才處理

  6. SQLiteDatabase db = dh.getWritableDatabase();

  7. ret = db.delete("tbl_user", selection, selectionArgs);

  8. }else if(sMatcher.match(uri)==SINGLE_RECORD){//這里應(yīng)該處理帶id的uri,省略了.....}

  9. return ret;

  10. }

復(fù)制代碼

getType的簡(jiǎn)單實(shí)現(xiàn),getType方法返回?cái)?shù)據(jù)的MIME type
  1. public String getType(Uri uri) {

  2. switch (sMatcher.match(uri)) {

  3.     case ALL_RECORDS:

  4.       return "vnd.android.cursor.dir/vnd.cn.javass.users";

  5.     case SINGLE_RECORD:

  6.       return "vnd.android.cursor.item/vnd.cn.javass.users";

  7.     default:

  8.       throw new IllegalArgumentException("unknown URI " + uri);

  9. }

  10. }

復(fù)制代碼

  1. public String getType(Uri uri) {

  2. switch (sMatcher.match(uri)) {

  3.     case ALL_RECORDS:

  4.       return "vnd.android.cursor.dir/vnd.cn.javass.users";

  5.     case SINGLE_RECORD:

  6.       return "vnd.android.cursor.item/vnd.cn.javass.users";

  7.     default:

  8.       throw new IllegalArgumentException("unknown URI " + uri);

  9. }

  10. }

復(fù)制代碼

onCreate方法的簡(jiǎn)單實(shí)現(xiàn)java代碼
  1. public boolean onCreate() {

  2. if (mContext == null) {mContext = this.getContext();}

  3. if(dh==null){

  4. dh = new DBHelper(mContext,"testDB1",null,1);

  5. }

  6. return true;

  7. }

復(fù)制代碼

  1. public boolean onCreate() {

  2. if (mContext == null) {mContext = this.getContext();}

  3. if(dh==null){

  4. dh = new DBHelper(mContext,"testDB1",null,1);

  5. }

  6. return true;

  7. }

復(fù)制代碼

使用自己的Content Provider有了自己實(shí)現(xiàn)的Content Provider后,要使用就很簡(jiǎn)單了。首先要在AndroidManifest.xml文件中注冊(cè)自己的Content Provider,示例如下:
java代碼:
  1. <provider android:name=".MyCP"

  2. android:authorities="cn.javass.mycp"></provider>

  3. [java] view plaincopy

  4. <provider android:name=".MyCP"

  5. android:authorities="cn.javass.mycp"></provider>

復(fù)制代碼

使用新增的功能,先示范單條新增:
java代碼:
  1. ContentValues values = new ContentValues();

  2. values.put(MyCP.COLUMN_UUID, "test1");

  3. values.put(MyCP.COLUMN_NAME,"cc1");

  4. Uri uri = getContentResolver().insert(MyCP.CONTENT_URI, values);

  5. [java] view plaincopy

  6. ContentValues values = new ContentValues();

  7. values.put(MyCP.COLUMN_UUID, "test1");

  8. values.put(MyCP.COLUMN_NAME,"cc1");

  9. Uri uri = getContentResolver().insert(MyCP.CONTENT_URI, values);

復(fù)制代碼

還可以使用批處理的方式來使用新增的功能,示例如下:
java代碼:查看
  1. ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

  2. ops.add(ContentProviderOperation.newInsert(MyCP.CONTENT_URI)

  3. .withValue(MyCP.COLUMN_UUID, "test2")

  4. .withValue(MyCP.COLUMN_NAME, "cc2")

  5. .build());

  6. ops.add(ContentProviderOperation.newInsert(MyCP.CONTENT_URI)

  7. .withValue(MyCP.COLUMN_UUID, "test3")

  8. .withValue(MyCP.COLUMN_NAME, "cc3")

  9. .build());

  10. try {

  11. getContentResolver().applyBatch(MyCP.URI_AUTHORITY,ops);

  12. } catch (Exception e) {

  13. e.printStackTrace();

  14. }

復(fù)制代碼

  1. ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

  2. ops.add(ContentProviderOperation.newInsert(MyCP.CONTENT_URI)

  3. .withValue(MyCP.COLUMN_UUID, "test2")

  4. .withValue(MyCP.COLUMN_NAME, "cc2")

  5. .build());

  6. ops.add(ContentProviderOperation.newInsert(MyCP.CONTENT_URI)

  7. .withValue(MyCP.COLUMN_UUID, "test3")

  8. .withValue(MyCP.COLUMN_NAME, "cc3")

  9. .build());

  10. try {

  11. getContentResolver().applyBatch(MyCP.URI_AUTHORITY,ops);

  12. } catch (Exception e) {

  13. e.printStackTrace();

  14. }

復(fù)制代碼

使用查詢的功能:java代碼:
  1. Cursor c = getContentResolver().query(MyCP.CONTENT_URI,

  2. new String[] {MyCP.COLUMN_UUID, MyCP.COLUMN_NAME}, null,null, null);

  3. while (c.moveToNext()) {

  4. String dId = ""+c.getString(c.getColumnIndex(MyCP.COLUMN_UUID));

  5. String name = c.getString(c.getColumnIndex(MyCP.COLUMN_NAME));

  6. Log.i("now query","dataId="+dId+",name="+name);

  7. }

復(fù)制代碼

  1. Cursor c = getContentResolver().query(MyCP.CONTENT_URI,

  2. new String[] {MyCP.COLUMN_UUID, MyCP.COLUMN_NAME}, null,null, null);

  3. while (c.moveToNext()) {

  4. String dId = ""+c.getString(c.getColumnIndex(MyCP.COLUMN_UUID));

  5. String name = c.getString(c.getColumnIndex(MyCP.COLUMN_NAME));

  6. Log.i("now query","dataId="+dId+",name="+name);

  7. }

復(fù)制代碼

使用修改的功能,這里只示例單條的處理,批處理的方式參見前面新增的實(shí)現(xiàn):
java代碼:
  1. ContentValues values = new ContentValues();

  2. values.put(MyCP.COLUMN_UUID, "test1");

  3. values.put(MyCP.COLUMN_NAME,"cc1update");

  4. getContentResolver().update(MyCP.CONTENT_URI, values,MyCP.COLUMN_UUID+"=?",new String[]{"test1"});

復(fù)制代碼

  1. ContentValues values = new ContentValues();

  2. values.put(MyCP.COLUMN_UUID, "test1");

  3. values.put(MyCP.COLUMN_NAME,"cc1update");

  4. getContentResolver().update(MyCP.CONTENT_URI, values,MyCP.COLUMN_UUID+"=?",new String[]{"test1"});

復(fù)制代碼

使用刪除的功能:
  1. getContentResolver().delete(MyCP.CONTENT_URI, MyCP.COLUMN_UUID + "=?",new String[] { "test2" });

復(fù)制代碼

  1. getContentResolver().delete(MyCP.CONTENT_URI, MyCP.COLUMN_UUID + "=?",new String[] { "test2" });

復(fù)制代碼

幾點(diǎn)說明1:這里創(chuàng)建的自己的Content Provider是非常簡(jiǎn)單的,主要是沿用了前面SQLite的示例,當(dāng)然也可以使用文件操作的示例
2:一般來說,提供Content Provider的數(shù)據(jù),應(yīng)該有一個(gè)long型的id字段,由于前面的示例沒有,所以上面的示例沒有提供
3:在自己的Content Provider實(shí)現(xiàn)里面,應(yīng)該根據(jù)Uri是否帶有id的情況進(jìn)行相應(yīng)的處理,為了示例的簡(jiǎn)單,就沒有那么實(shí)現(xiàn)了
4:由于Content Provider可能被多個(gè)應(yīng)用同時(shí)使用,因此需要在實(shí)現(xiàn)Content Provider的時(shí)候進(jìn)行多線程控制,目前并沒有實(shí)現(xiàn)這樣的功能
5:處理多線程的一個(gè)好方式就是,當(dāng)數(shù)據(jù)發(fā)生改變的時(shí)候,通知所有相關(guān)的數(shù)據(jù)改變,比如在新增、修改、刪除方法里面提供:

java代碼:
  1. getContext().getContentResolver().notifyChange(Uri, null);

復(fù)制代碼

  1. getContext().getContentResolver().notifyChange(Uri, null);

復(fù)制代碼

操作通訊錄要使用其他應(yīng)用提供的Content Provider是非常簡(jiǎn)單的,只需要獲取ContentResolver對(duì)象,然后使用它的方法操作數(shù)據(jù)即可。
這里以最常見的功能:操作通訊錄 為例來示范如何使用Content Provider。
記得添加操作Contacts需要的權(quán)限

java代碼:
  1. <uses-permission android:name="android.permission.WRITE_CONTACTS"/>

  2. <uses-permission android:name="android.permission.READ_CONTACTS"/>

復(fù)制代碼

  1. <uses-permission android:name="android.permission.WRITE_CONTACTS"/>

  2. <uses-permission android:name="android.permission.READ_CONTACTS"/>

復(fù)制代碼

先看看新增的功能實(shí)現(xiàn),先以單獨(dú)操作的方式來示范:
java代碼:
  1. //1:添加原始的帳號(hào)信息

  2. ContentValues values = new ContentValues();

  3. values.put(RawContacts.ACCOUNT_TYPE, "userAccount");

  4. values.put(RawContacts.ACCOUNT_NAME, "cc");

  5. Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values);

  6. long rawContactId = ContentUris.parseId(rawContactUri);

  7. //2:添加賬戶人員的姓名

  8. values.clear();

  9. values.put(Data.RAW_CONTACT_ID, rawContactId);

  10. values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);

  11. values.put(StructuredName.DISPLAY_NAME, "cc1Name");

  12. getContentResolver().insert(Data.CONTENT_URI, values);

復(fù)制代碼

  1. //1:添加原始的帳號(hào)信息

  2. ContentValues values = new ContentValues();

  3. values.put(RawContacts.ACCOUNT_TYPE, "userAccount");

  4. values.put(RawContacts.ACCOUNT_NAME, "cc");

  5. Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values);

  6. long rawContactId = ContentUris.parseId(rawContactUri);

  7. //2:添加賬戶人員的姓名

  8. values.clear();

  9. values.put(Data.RAW_CONTACT_ID, rawContactId);

  10. values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);

  11. values.put(StructuredName.DISPLAY_NAME, "cc1Name");

  12. getContentResolver().insert(Data.CONTENT_URI, values);

復(fù)制代碼

java代碼:
  1. //3:添加電話信息

  2. values.clear();

  3. values.put(Data.RAW_CONTACT_ID, rawContactId);

  4. values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);

  5. values.put(Phone.NUMBER, "13567890987");

  6. values.put(Phone.TYPE, Phone.TYPE_CUSTOM);

  7. values.put(Phone.LABEL, "cc1");

  8. Uri dataUri = getContentResolver().insert(Data.CONTENT_URI,values);

  9. //同理,還可以添加Email等等信息

復(fù)制代碼

  1. //3:添加電話信息

  2. values.clear();

  3. values.put(Data.RAW_CONTACT_ID, rawContactId);

  4. values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);

  5. values.put(Phone.NUMBER, "13567890987");

  6. values.put(Phone.TYPE, Phone.TYPE_CUSTOM);

  7. values.put(Phone.LABEL, "cc1");

  8. Uri dataUri = getContentResolver().insert(Data.CONTENT_URI,values);

  9. //同理,還可以添加Email等等信息

復(fù)制代碼

新增的功能實(shí)現(xiàn),以批處理操作的方式來示范:前面第一步,添加原始的帳號(hào)信息的過程是一樣的,批處理最好用在后面都是對(duì)Data進(jìn)行操作的過程中,示例如下:

java代碼:
  1. ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

  2. ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)

  3. .withValue(Data.RAW_CONTACT_ID, rawContactId)

  4. .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)

  5. .withValue(StructuredName.DISPLAY_NAME, "cc1Name")

  6. .build());

  7. ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)

  8. .withValue(Data.RAW_CONTACT_ID, rawContactId)

  9. .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)

  10. .withValue(Phone.NUMBER, "13567890989")

  11. .withValue(Phone.TYPE, Phone.TYPE_CUSTOM)

  12. .withValue(Phone.LABEL, "cc1").build());

  13. try {

  14. getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);

  15. } catch (Exception e) {

  16. e.printStackTrace();

  17. }

復(fù)制代碼

  1. ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

  2. ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)

  3. .withValue(Data.RAW_CONTACT_ID, rawContactId)

  4. .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)

  5. .withValue(StructuredName.DISPLAY_NAME, "cc1Name")

  6. .build());

  7. ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)

  8. .withValue(Data.RAW_CONTACT_ID, rawContactId)

  9. .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)

  10. .withValue(Phone.NUMBER, "13567890989")

  11. .withValue(Phone.TYPE, Phone.TYPE_CUSTOM)

  12. .withValue(Phone.LABEL, "cc1").build());

  13. try {

  14. getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);

  15. } catch (Exception e) {

  16. e.printStackTrace();

  17. }

復(fù)制代碼

查詢功能的實(shí)現(xiàn),示例如下:
java代碼:
  1. //1:得到要操作的原始帳號(hào)信息

  2. Cursor c = getContentResolver().query(RawContacts.CONTENT_URI,

  3. new String[]{RawContacts._ID},RawContacts.ACCOUNT_NAME+"=? ",new String[]{"cc"}, null);

  4. long rawContactId = 0L;

  5. while(c.moveToNext()){

  6. rawContactId = c.getLong(c.getColumnIndex(RawContacts._ID));

  7. }

  8. c.close();

  9. //然后開始獲取你需要的數(shù)據(jù),這里示范讀取電話數(shù)據(jù),同理可以讀取其他的數(shù)據(jù),如Email數(shù)據(jù)

  10. c = getContentResolver().query(Data.CONTENT_URI,

  11. new String[] {Data._ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL},

  12. Data.RAW_CONTACT_ID+"=?"+" and "+Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'",

  13.           new String[]{""+rawContactId}, null);

  14. while (c.moveToNext()) {

  15. String dId = ""+c.getInt(c.getColumnIndex(Data._ID));

  16. String name = c.getString(c.getColumnIndex(Phone.LABEL));

  17. String num = c.getString(c.getColumnIndex(Phone.NUMBER));

  18. String type = c.getString(c.getColumnIndex(Phone.TYPE));

  19. Log.i("now query","dataId="+dId+",name="+name+",name="+num+", type="+type);

  20. }

復(fù)制代碼

  1. //1:得到要操作的原始帳號(hào)信息

  2. Cursor c = getContentResolver().query(RawContacts.CONTENT_URI,

  3. new String[]{RawContacts._ID},RawContacts.ACCOUNT_NAME+"=? ",new String[]{"cc"}, null);

  4. long rawContactId = 0L;

  5. while(c.moveToNext()){

  6. rawContactId = c.getLong(c.getColumnIndex(RawContacts._ID));

  7. }

  8. c.close();

  9. //然后開始獲取你需要的數(shù)據(jù),這里示范讀取電話數(shù)據(jù),同理可以讀取其他的數(shù)據(jù),如Email數(shù)據(jù)

  10. c = getContentResolver().query(Data.CONTENT_URI,

  11. new String[] {Data._ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL},

  12. Data.RAW_CONTACT_ID+"=?"+" and "+Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'",

  13.           new String[]{""+rawContactId}, null);

  14. while (c.moveToNext()) {

  15. String dId = ""+c.getInt(c.getColumnIndex(Data._ID));

  16. String name = c.getString(c.getColumnIndex(Phone.LABEL));

  17. String num = c.getString(c.getColumnIndex(Phone.NUMBER));

  18. String type = c.getString(c.getColumnIndex(Phone.TYPE));

  19. Log.i("now query","dataId="+dId+",name="+name+",name="+num+", type="+type);

  20. }

復(fù)制代碼

修改功能的實(shí)現(xiàn),示例如下:
java代碼:
  1. //1:應(yīng)該要先得到要修改的Data數(shù)據(jù),這里為了示范簡(jiǎn)單,就直接改了

  2. //2:設(shè)置修改的值

  3. ContentValues values = new ContentValues();

  4. values.put(Data.RAW_CONTACT_ID, 3);//測(cè)試時(shí)的數(shù)據(jù)是3

  5. values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);

  6. values.put(Phone.NUMBER, “13567890981”);//修改了

  7. values.put(Phone.TYPE, Phone.TYPE_CUSTOM);

  8. values.put(Phone.LABEL, “upuser1”);//修改了

  9. getContentResolver().update(Data.CONTENT_URI, values,

  10. Data._ID + "=?",

  11. new String[] { “31” });//測(cè)試時(shí)的id是31

復(fù)制代碼

  1. //1:應(yīng)該要先得到要修改的Data數(shù)據(jù),這里為了示范簡(jiǎn)單,就直接改了

  2. //2:設(shè)置修改的值

  3. ContentValues values = new ContentValues();

  4. values.put(Data.RAW_CONTACT_ID, 3);//測(cè)試時(shí)的數(shù)據(jù)是3

  5. values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);

  6. values.put(Phone.NUMBER, “13567890981”);//修改了

  7. values.put(Phone.TYPE, Phone.TYPE_CUSTOM);

  8. values.put(Phone.LABEL, “upuser1”);//修改了

  9. getContentResolver().update(Data.CONTENT_URI, values,

  10. Data._ID + "=?",

  11. new String[] { “31” });//測(cè)試時(shí)的id是31

復(fù)制代碼

修改也可以使用批處理的功能來實(shí)現(xiàn),可以參考前面新增的批處理實(shí)現(xiàn)。
刪除功能的實(shí)現(xiàn),示例如下:
java代碼:
  1. //1:應(yīng)該要先得到要?jiǎng)h除的Data數(shù)據(jù),這里為了示范簡(jiǎn)單,就直接改了

  2. //2:刪除數(shù)據(jù),直接刪除原始的內(nèi)容

  3. getContentResolver().delete(RawContacts.CONTENT_URI, Data._ID + "=?",

  4. new String[] { "31" });

復(fù)制代碼

  1. //1:應(yīng)該要先得到要?jiǎng)h除的Data數(shù)據(jù),這里為了示范簡(jiǎn)單,就直接改了

  2. //2:刪除數(shù)據(jù),直接刪除原始的內(nèi)容

  3. getContentResolver().delete(RawContacts.CONTENT_URI, Data._ID + "=?",

  4. new String[] { "31" });

復(fù)制代碼

  1. 只要?jiǎng)h除了原始的帳號(hào)數(shù)據(jù),那么所有與它附屬的數(shù)據(jù),比如電話、Email等都會(huì)被自動(dòng)刪除。如果一個(gè)Contact對(duì)應(yīng)的所有原始帳號(hào)數(shù)據(jù)都被刪除掉了,那么Contact會(huì)被自動(dòng)刪除掉。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

標(biāo)題名稱:【安卓】ContentProvider基礎(chǔ)-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://chinadenli.net/article6/deecog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、面包屑導(dǎo)航微信小程序、服務(wù)器托管網(wǎng)站維護(hù)、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)