Android四大組件-ContentProvider

來源:互聯網
上載者:User

Android四大組件-ContentProvider
ContentProvider:內容提供者

ContentProvider簡介:
當應用繼承ContentProvider類,並重寫該類用於提供資料和儲存資料的方法,就可以向其他應用共用其資料。雖然使用其他方法也可以對外共用資料,但資料訪問方式會因資料存放區的方式而不同,如:採用檔案方式對外共用資料,需要進行檔案操作讀寫資料;採用sharedpreferences共用資料,需要使用sharedpreferences API讀寫資料。而使用ContentProvider共用資料的好處是統一了資料訪問方式。
Uri類簡介
Uri代表了要操作的資料,Uri主要包含了兩部分資訊:1.需要操作的ContentProvider ,2.對ContentProvider中的什麼資料進行操作,一個Uri由以下幾部分組成:
1.scheme:ContentProvider(內容提供者)的scheme已經由Android所規定為:content://。
2.主機名稱(或Authority):用於唯一標識這個ContentProvider,外部調用者可以根據這個標識來找到它。
3.路徑(path):可以用來表示我們要操作的資料,路徑的構建應根據業務而定,如下:
• 要操作contact表中id為10的記錄,可以構建這樣的路徑:/contact/10
• 要操作contact表中id為10的記錄的name欄位, contact/10/name
• 要操作contact表中的所有記錄,可以構建這樣的路徑:/contact

本篇主要圍繞通話記錄和連絡人講解ContentProvider的使用。

首先來瞭解一下通話記錄和連絡人的表結構。
這是手機中部分表:

通話記錄在calls表中,連絡人表主要有三個:raw_contacts、data、mimetype表。
–連絡人記錄
–存放連絡人資訊的表(注意表結構):
連絡人資訊表:raw_contacts
–_id
–display_name連絡人名稱

連絡人資料表:data
–_id
–raw_contact_id(外鍵,raw_contacts表的_id)
–data1
–data2
–mimetype_id(資料類型,如電話,郵箱,地址 外鍵(mimeypes))

資料類型表:mimeypes
–_id
–mimetype

資料類型表中需要注意的是name、phone_v2、email_v2欄位,對應id是7、5、1;

一、ContentResolver的使用

1)定義ContentProvieder組件提供的內容的Uri介面
2)定義被訪問的表中的欄位
3)添加存取權限

簡單使用1:查詢最近連絡人記錄

// 訪問撥號應用下的ContentProvieder組件提供的內容的Uri介面private Uri callUri = CallLog.Calls.CONTENT_URI;// 被訪問的表中的欄位private String[] columns = { CallLog.Calls._ID, CallLog.Calls.NUMBER,CallLog.Calls.DATE, CallLog.Calls.TYPE };private void loadData() {        // 使用ContentResolver訪問撥號記錄應用下的ContentProvider組件提供的資料庫中表的資料        // 得到ContentResolver對象        ContentResolver resolver = getContentResolver();        // 查詢uri代表的資源(從 Uri代表的表中進行查詢)        Cursor cursor = resolver.query(callUri, columns, null, null, null);        while (cursor.moveToNext()) {            long id = cursor.getLong(0);            String number = cursor.getString(1);            long time = cursor.getLong(2);            int type = cursor.getInt(3);            String date = new SimpleDateFormat(yyyy-MM-dd E HH:mm:ss)                    .format(new Date(time));            String types = (type == 1 ? 撥入 : (type == 2 ? 撥出 : 未接));            datas.add(new CallInfo(id, number, date, types));        }        adapter.notifyDataSetChanged();    }

簡單使用2:查詢手機連絡人,然後執行增刪改操作
需要瞭解連絡人資料庫中有哪些表及表的結構:通過adb shell可以查看。
–連絡人記錄
–存放連絡人資訊的表(注意表結構):
連絡人資訊表:raw_contacts
–_id
–display_name連絡人名稱
連絡人資料表:data
–_id
–raw_contact_id(外鍵,raw_contacts表的_id)
–data1:電話、郵箱、姓名等資訊
–data2
–mimetype_id(資料類型,如電話,郵箱,地址 外鍵(mimeypes))
資料類型表:mimeypes
–_id
–mimetype
– mimetype_id=1:郵箱
– mimetype_id=5:電話
– mimetype_id=7:姓名

// 訪問raw_contacts這張表的Uri    private Uri contactUri = Uri            .parse(content://com.android.contacts/raw_contacts);    private String[] conColumn = { _id, display_name };    // //訪問data這張表的Uri    private Uri dataUri = Uri.parse(content://com.android.contacts/data);    private String[] dataColumn = { data1 };

—>增刪該查操作都是第一步得到ContentResolver操作對象,第二步執行已經定義好的方法。

        

2.1新增連絡人...:
// 向連絡人表raw_contacts中添加新的連絡人資訊

ContentValues value = new ContentValues();value.put(display_name, name);value.put(display_name_alt, name);// 返回新插入的記錄Uri,Uri中包含了_id// content://com.android.contacts/raw_contacts/#8    Uri datasUri = getContentResolver().insert(contactUri,value);

這個方法值得注意的是返回的是一個uri,也就是新增的這條資料的uri,如果想得到該條記錄的id可以調用這個方法:
long _id = ContentUris.parseId(datasUri);

–姓名:
value.put(“data1”, name);
value.put(“mimetype”,”vnd.android.cursor.item/name”);
–電話:
value.put(“data1”, phone);
value.put(“mimetype”,”vnd.android.cursor.item/phone_v2”);
–郵件:
value.put(“data1”, email);
value.put(“mimetype”,”vnd.android.cursor.item/email_v2”);

2.2刪除連絡人:都是很簡單的操作
// 再從連絡人表中刪除資訊
getContentResolver().delete(contactUri, “_id=” + id,null);

2.3修改連絡人:

value.put(display_name, name);value.put(display_name_alt, name);long id = Long.parseLong(String.valueOf(datas.get(curItemPosition).get(id)));// 更新連絡人資訊getContentResolver().update(contactUri, value,_id= + id, null);

2.4查詢所有連絡人

ContentResolver resolver = getContentResolver();// 先從連絡人表中查詢所有人的資訊Cursor cursor = resolver.query(contactUri, conColumn, null, null, null);
二、自訂ContentProvider

1.步驟:
1)聲明該contentProvider的唯一標識,通常使用包名加資料庫名,必須小寫
2)為該組件中可以被外界訪問的資料庫中的資源定義Code標識,不對外界開放的不用定義
3)定義訪問資源的Uri的匹配器對象–使用該類產生被訪問的資源的Uri
4)UriMatcher添加訪問uri
5)資訊清單檔中註冊組件 name authorities
6)聲明訪問該組件的許可權
7)重寫provider的增刪改查方法

2.實現
1)自訂資料庫

public class DBHelper extends SQLiteOpenHelper {    public DBHelper(Context context) {        super(context, users.db, null, 1);    }    @Override    public void onCreate(SQLiteDatabase db) {        // TODO 初始化資料庫        db.execSQL(create table t_user(_id integer primary key,uname,upass,money));        db.execSQL(create table t_order(_id integer primary key,user_id,price,productname));        db.execSQL(insert into t_user(uname,upass,money) values('lisa','123',200));        db.execSQL(insert into t_user(uname,upass,money) values('zhangsan','1234',2000));    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        // TODO 資料庫升級時執行該方法        if (newVersion > oldVersion) {            db.execSQL(drop table if exists t_user);            db.execSQL(drop table if exists t_order);            onCreate(db);        }    }}

2)按上述步驟定義ContentProvider

public class UserContentProvider extends ContentProvider {    // 聲明該ContentProvider的唯一標識--通常使用包名+資料庫名--必須小寫    public static final String AUTHORITY = com.beiing.contentprovider_selfdefine.users;    // 為該組件中可以被外界訪問的資料庫中的資源定義Code標識    public static final int CODE_USER = 1;    public static final int CODE_ORDER = 2;    // 定義訪問資源的Uri的匹配器對象--使用該類產生被訪問的資源的Uri    private static UriMatcher uriMatcher;    static {        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);        // content://com.beiing.contentprovider_selfdefine.users/user        uriMatcher.addURI(AUTHORITY, user, CODE_USER);        // content://com.beiing.contentprovider_selfdefine.users/order        uriMatcher.addURI(AUTHORITY, order, CODE_ORDER);    }    private DBHelper dbHelper;    @Override    public boolean onCreate() {        // TODO 初始化 資料庫操作的工具類        dbHelper = new DBHelper(getContext());        return false;    }    @Override    public Cursor query(Uri uri, String[] projection, String selection,            String[] selectionArgs, String sortOrder) {        SQLiteDatabase db = dbHelper.getReadableDatabase();        Cursor cursor = null;        int code = uriMatcher.match(uri);        switch (code) {        case CODE_USER:            cursor = db.query(t_user, projection, selection, selectionArgs,                    null, null, sortOrder);            break;        case CODE_ORDER:            break;        }        return cursor;    }    @Override    public Uri insert(Uri uri, ContentValues values) {        // TODO 向資料庫中插入資料        SQLiteDatabase db = dbHelper.getWritableDatabase();        if (uriMatcher.match(uri) == CODE_USER) {            long id = db.insert(t_user, null, values);            // 返回新插入的記錄的 Uri,回憶插入新資料時可以通過返回的uri得到id            // content://com.beiing.contentprovider_selfdefine.users/user/6            return ContentUris.withAppendedId(uri, id);        }        return null;    }    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {        // TODO 刪除資料庫中的資料        SQLiteDatabase db = dbHelper.getWritableDatabase();        int num = 0;        if (uriMatcher.match(uri) == CODE_USER) {            num = db.delete(t_user, selection, selectionArgs);        }        return num;    }    @Override    public int update(Uri uri, ContentValues values, String selection,            String[] selectionArgs) {        // TODO 修改資料庫中的資料        SQLiteDatabase db = dbHelper.getWritableDatabase();        if (uriMatcher.match(uri) == CODE_USER) {            return db.update(t_user, values, selection, selectionArgs);        }        return 0;    }    @Override    public String getType(Uri uri) {        return null;    }}

3)資訊清單檔中註冊內容提供器

注意:還需要添加訪問該provider的許可權和修改的操作許可權,否則其他程式不能訪問或操作

    

4)在其他程式中使用
和上面使用類似,不贅述了。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.