Android ContentProvider

如何實現(xiàn) ContentProvider?

  1. 繼承抽象類 ContentProvider 實現(xiàn)一系列針對于數(shù)據(jù)的增刪改查等方法;
  2. 需在 AndroidManifest.xml 中完成對 ContentProvider的注冊。
    <provider
    android:name="com.imooc.MusicProvider"
    android:authorities="com.provider.music" ></provider>
    注:注冊的anthorities的屬性值,是全局唯一的。

第三方的訪問能力完全取決于你自定義的ContentProvider,如果定義的ContentProvider只實現(xiàn)查詢功能,那么第三方程序就只能做查詢的操作,不能做其他的操作。

繼承 ContentProvider 之后實現(xiàn)的幾個方法:
onCreate() :在ContentProvider創(chuàng)建后使用。
Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):根據(jù)Uri查詢selection指定的條件所匹配的全部記錄,并且可以指定查詢哪些字段、以什么方式排序。
insert(Uri uri, ContentValues values):根據(jù)Uri插入values對應(yīng)的數(shù)據(jù)。
delete(Uri uri, String selection, String[] selectionArgs):根據(jù)Uri刪除selection指定的條件所匹配的全部記錄。
update(Uri uri, ContentValues contentValues, String selection, String[] selectionArgs):根據(jù)Uri修改selection指定的條件所匹配的全部記錄。
比較值得注意的如下:
getType(Uri uri):返回當前Uri的 MIME 類型。
如果當前的Uri包含多條記錄,那么 MIME 類型字符串就以 vnd.android.dir/ 開頭。
如果該Uri對應(yīng)的數(shù)據(jù)只有一條記錄,那么 MIME 類型字符串就以 vnd.android.cursor.item/ 開頭


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

MainActivity.java

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ContentResolver cr =  getContentResolver();
        //向聯(lián)系人中 插入一行數(shù)據(jù)
        ContentValues values = new ContentValues();
       Uri uri =  cr.insert(RawContacts.CONTENT_URI, values);
       Long raw_contact_id = ContentUris.parseId(uri);
       values.clear();
       //插入人名
       values.put(StructuredName.RAW_CONTACT_ID, raw_contact_id);
       values.put(StructuredName.DISPLAY_NAME, "張三三");
       values.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
       uri = cr.insert(Data.CONTENT_URI, values);
       //插入電話信息
       values.clear();
       values.put(Phone.RAW_CONTACT_ID,raw_contact_id);
       values.put(Phone.NUMBER,"13333333333");
       values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
       uri = cr.insert(Data.CONTENT_URI, values);
    }
    
}

MainActivity.java

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.Contacts;
import android.util.Log;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ContentResolver cr = getContentResolver();
        Cursor c = cr.query(Contacts.CONTENT_URI, new String[] { Contacts._ID,
                Contacts.DISPLAY_NAME }, null, null, null);
        if (c != null) {
            while (c.moveToNext()) {
                int id = c.getInt(c.getColumnIndex("_id"));
                Log.i("info", "_id:" + id);
                Log.i("info",
                        "name:" + c.getString(c.getColumnIndex("display_name")));
                Cursor c1 = cr.query(Phone.CONTENT_URI, new String[] {
                        Phone.NUMBER, Phone.TYPE },
                        Phone.CONTACT_ID + "=" + id, null, null);
                // 根據(jù)聯(lián)系人ID查詢出聯(lián)系人的電話號碼
                if (c1 != null) {
                    while (c1.moveToNext()) {
                        int type = c1.getInt(c1.getColumnIndex(Phone.TYPE));
                        if (type == Phone.TYPE_HOME) {
                            Log.i("info",
                                    "家庭電話:"
                                            + c1.getString(c1
                                                    .getColumnIndex(Phone.NUMBER)));
                        } else if (type == Phone.TYPE_MOBILE) {
                            Log.i("info",
                                    "手機:"
                                            + c1.getString(c1
                                                    .getColumnIndex(Phone.NUMBER)));
                        }
                    }
                    c1.close();
                }
                // 根據(jù)聯(lián)系人的ID去查詢出聯(lián)系人的郵箱地址
                Cursor c2 = cr.query(Email.CONTENT_URI, new String[] {
                        Email.DATA, Email.TYPE }, Email.CONTACT_ID + "=" + id,
                        null, null);
                if (c2 != null) {
                    while (c2.moveToNext()) {
                        int type = c2.getInt(c2.getColumnIndex(Email.DATA));
                        if (type == Email.TYPE_WORK) {
                            Log.i("info",
                                    "工作郵箱:"
                                            + c2.getString(c2
                                                    .getColumnIndex(Email.DATA)));
                        }
                    }
                    c2.close();
                }
            }
            c.close();
        }
    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第七章 內(nèi)容提供者 內(nèi)容提供者主要用在不同應(yīng)用程序之間實現(xiàn)數(shù)據(jù)共享。 內(nèi)容提供者用法一般有兩種: 一、訪問其他應(yīng)用...
    王世軍Steven閱讀 780評論 0 0
  • 上一篇文章Android ContentProvider(二)學習了如何在自己的應(yīng)用程序中訪問其他程序的數(shù)據(jù),這篇...
    前端develop閱讀 2,872評論 0 2
  • 一、使用ContentProvider(內(nèi)容提供者)共享數(shù)據(jù) ContentProvider在android中的作...
    IT楓閱讀 4,495評論 0 7
  • 冬眠的蛇蘇醒了,那是春天的電報吧? 漫山遍野的迎春花開了,那是春天的血液在流動吧? 公園里的桃花開了,那是...
    淺淺的簡書閱讀 480評論 0 0
  • 在家抱著電腦窩在床上看電影的時候,我媽總是一個白眼飛來, “你都坐那好幾個小時不動了,干什么呢?” 我說看電影呢,...
    圓十二閱讀 2,417評論 14 28

友情鏈接更多精彩內(nèi)容