中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【安卓】Content Provider 基礎

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

java代碼:
  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. //對外的數據字段   

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

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

復制代碼

  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. //對外的數據字段  

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

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

復制代碼

3:提供UriMatcher,用來判斷外部傳入的Uri是否帶有id,好區分處理:
  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. }  

復制代碼

  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. }  

復制代碼

然后就是根據自己保存數據的具體實現,來實現Content Provider的方法,這里以前面SQLite的示例來演示如何實現這些方法。
新增功能的簡單實現
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. }  

復制代碼

  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. }

復制代碼

查詢功能的簡單實現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.     

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

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

  8.     

  9. return c;   

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

  11. //這里應該處理帶id的uri,省略了.....   

  12. }   

  13. return null;   

  14. }  

復制代碼

  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.    

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

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

  8.    

  9. return c;  

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

  11. //這里應該處理帶id的uri,省略了.....  

  12. }  

  13. return null;  

  14. }

復制代碼

修改功能的簡單實現
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){//這里應該處理帶id的uri,省略了.....}   

  8. return ret;   

  9. }  

復制代碼

  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){//這里應該處理帶id的uri,省略了.....}  

  8. return ret;  

  9. }

復制代碼

刪除功能的簡單實現
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){//這里應該處理帶id的uri,省略了.....}   

  8. return ret;   

  9. }  

復制代碼

  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){//這里應該處理帶id的uri,省略了.....}  

  9. return ret;  

  10. }  

復制代碼

getType的簡單實現,getType方法返回數據的MIME typejava代碼:
  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. }  

復制代碼

  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. }  

復制代碼

onCreate方法的簡單實現
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. }

復制代碼

  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. }  

復制代碼

使用自己的Content Provider有了自己實現的Content Provider后,要使用就很簡單了。首先要在AndroidManifest.xml文件中注冊自己的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>

復制代碼

使用新增的功能,先示范單條新增:
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);  

復制代碼

還可以使用批處理的方式來使用新增的功能,示例如下:
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. }  

復制代碼

  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. }

復制代碼

使用查詢的功能:
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. }  

復制代碼

  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. }  

復制代碼

使用修改的功能,這里只示例單條的處理,批處理的方式參見前面新增的實現:
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"});  

復制代碼

  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"});  

復制代碼

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

復制代碼

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

復制代碼

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

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

復制代碼

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

復制代碼

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

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

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

復制代碼

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

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

復制代碼

先看看新增的功能實現,先以單獨操作的方式來示范:
java代碼:
  1. //1:添加原始的帳號信息   

  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);   

  13.    

復制代碼

  1. //1:添加原始的帳號信息  

  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);  

  13.    

復制代碼

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等等信息  

復制代碼

  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等等信息  

復制代碼

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

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. }

復制代碼

  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. }  

復制代碼

查詢功能的實現,示例如下:
java代碼:
  1. //1:得到要操作的原始帳號信息   

  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. //然后開始獲取你需要的數據,這里示范讀取電話數據,同理可以讀取其他的數據,如Email數據   

  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. }  

復制代碼

  1. //1:得到要操作的原始帳號信息  

  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. //然后開始獲取你需要的數據,這里示范讀取電話數據,同理可以讀取其他的數據,如Email數據  

  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. }  

復制代碼

修改功能的實現,示例如下:
java代碼:
  1. //1:應該要先得到要修改的Data數據,這里為了示范簡單,就直接改了   

  2.     

  3. //2:設置修改的值   

  4. ContentValues values = new ContentValues();   

  5. values.put(Data.RAW_CONTACT_ID, 3);//測試時的數據是3   

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

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

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

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

  10.     

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

  12. Data._ID + "=?",   

  13. new String[] { “31” });//測試時的id是31  

復制代碼

  1. //1:應該要先得到要修改的Data數據,這里為了示范簡單,就直接改了  

  2.    

  3. //2:設置修改的值  

  4. ContentValues values = new ContentValues();  

  5. values.put(Data.RAW_CONTACT_ID, 3);//測試時的數據是3  

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

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

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

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

  10.    

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

  12. Data._ID + "=?",  

  13. new String[] { “31” });//測試時的id是31  

復制代碼

修改也可以使用批處理的功能來實現,可以參考前面新增的批處理實現。
刪除功能的實現,示例如下:
java代碼:
  1. //1:應該要先得到要刪除的Data數據,這里為了示范簡單,就直接改了   

  2. //2:刪除數據,直接刪除原始的內容   

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

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

復制代碼

  1. //1:應該要先得到要刪除的Data數據,這里為了示范簡單,就直接改了  

  2. //2:刪除數據,直接刪除原始的內容  

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

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

復制代碼

  1. 只要刪除了原始的帳號數據,那么所有與它附屬的數據,比如電話、Email等都會被自動刪除。如果一個Contact對應的所有原始帳號數據都被刪除掉了,那么Contact會被自動刪除掉。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乐都县| 阿荣旗| 沙河市| 漾濞| 集安市| 晴隆县| 樟树市| 时尚| 社会| 长汀县| 黄浦区| 凤台县| 电白县| 西峡县| 远安县| 黔西县| 布拖县| 彝良县| 剑阁县| 南岸区| 姜堰市| 凤城市| 汾阳市| 游戏| 翁源县| 响水县| 繁昌县| 闻喜县| 武功县| 博爱县| 廊坊市| 类乌齐县| 天台县| 林芝县| 上饶市| 洛浦县| 邳州市| 灌阳县| 湄潭县| 故城县| 正定县|