Content Provider 基础
16lz
2021-01-26
Content Provider基础知识
http://sishuok.com/forum/blogPost/list/0/2749.html#7733
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是非常简单的,只需要获得ContentResolver对象,然后通过这个对象进行数据的CRUD操作。获得ContentResolver的方式如下:ContentResolver cr = getContentResolver();
Android系统负责初始化所有的Content Provider,不需要用户自己去创建。实际上,Content Provider的用户都不可能直接访问到Content Provider实例,只能通过ContentResolver在中间代理。 Content Provider展示数据类似一个数据库的表。其中:每行有个值唯一的数字字段,名为_ID,可用于对表中指定记录的定位;Content Provider返回的数据结构,类似JDBC的ResultSet,在Android中,是Cursor对象。理解URI
1:每个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 Provider
UriMatcher:用于匹配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代码: 查看 复制到剪贴板 打印
- publicstaticfinalStringURI_AUTHORITY="cn.javass.mycp";
- publicstaticfinalStringURI_PATH="Users";
- publicstaticfinalStringURI_PATH2="Users/#";
- publicstaticfinalUriCONTENT_URI=Uri.parse("content://"
- +URI_AUTHORITY+"/"+URI_PATH);
- //对外的数据字段
- publicstaticfinalStringCOLUMN_UUID="uuid";
- publicstaticfinalStringCOLUMN_NAME="name";
public static final String URI_AUTHORITY = "cn.javass.mycp";public static final String URI_PATH = "Users";public static final String URI_PATH2 = "Users/#";public static final Uri CONTENT_URI = Uri.parse("content://"+ URI_AUTHORITY + "/" + URI_PATH);//对外的数据字段public static final String COLUMN_UUID = "uuid";public static final String COLUMN_NAME = "name";3:提供UriMatcher,用来判断外部传入的Uri是否带有id,好区分处理:
java代码: 查看 复制到剪贴板 打印
- publicstaticfinalintALL_RECORDS=1;
- publicstaticfinalintSINGLE_RECORD=2;
- publicstaticUriMatchersMatcher=null;
- static{
- sMatcher=newUriMatcher(UriMatcher.NO_MATCH);
- sMatcher.addURI(URI_AUTHORITY,URI_PATH,ALL_RECORDS);
- sMatcher.addURI(URI_AUTHORITY,URI_PATH2,SINGLE_RECORD);
- }
public static final int ALL_RECORDS = 1;public static final int SINGLE_RECORD = 2;public static UriMatcher sMatcher = null;static {sMatcher = new UriMatcher(UriMatcher.NO_MATCH);sMatcher.addURI(URI_AUTHORITY, URI_PATH, ALL_RECORDS);sMatcher.addURI(URI_AUTHORITY, URI_PATH2, SINGLE_RECORD);}然后就是根据自己保存数据的具体实现,来实现Content Provider的方法,这里以前面SQLite的示例来演示如何实现这些方法。
新增功能的简单实现
java代码: 查看 复制到剪贴板 打印
- publicUriinsert(Uriuri,ContentValuesvalues){
- UriretUri=null;
- if(sMatcher.match(uri)==ALL_RECORDS){
- //判断是否需要处理,只有符合的才处理
- SQLiteDatabasedb=dh.getWritableDatabase();
- longid=db.insert("tbl_user",null,values);
- retUri=ContentUris.withAppendedId(uri,id);
- }
- returnretUri;
- }
public Uri insert(Uri uri, ContentValues values) {Uri retUri = null;if(sMatcher.match(uri)==ALL_RECORDS){//判断是否需要处理,只有符合的才处理SQLiteDatabase db = dh.getWritableDatabase();long id = db.insert("tbl_user",null, values);retUri = ContentUris.withAppendedId(uri, id);}return retUri;}
查询功能的简单实现
java代码: 查看 复制到剪贴板 打印
- publicCursorquery(Uriuri,String[]projection,Stringselection,
- String[]selectionArgs,StringsortOrder){
- if(sMatcher.match(uri)==ALL_RECORDS){
- SQLiteDatabasedb=dh.getWritableDatabase();
- Cursorc=db.query("tbl_user",projection,
- selection,selectionArgs,"","",sortOrder,"");
- returnc;
- }elseif(sMatcher.match(uri)==SINGLE_RECORD){
- //这里应该处理带id的uri,省略了.....
- }
- returnnull;
- }
public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {if(sMatcher.match(uri)==ALL_RECORDS){SQLiteDatabase db = dh.getWritableDatabase(); Cursor c = db.query("tbl_user", projection,selection,selectionArgs, "", "", sortOrder,""); return c;}else if(sMatcher.match(uri)==SINGLE_RECORD){//这里应该处理带id的uri,省略了.....}return null;}
修改功能的简单实现
java代码: 查看 复制到剪贴板 打印
- publicintupdate(Uriuri,ContentValuesvalues,Stringselection,String[]selectionArgs){
- intret=0;
- if(sMatcher.match(uri)==ALL_RECORDS){
- //判断是否需要处理,只有符合的才处理
- SQLiteDatabasedb=dh.getWritableDatabase();
- ret=db.update("tbl_user",values,selection,selectionArgs);
- }elseif(sMatcher.match(uri)==SINGLE_RECORD){//这里应该处理带id的uri,省略了.....}
- returnret;
- }
public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {int ret = 0;if(sMatcher.match(uri)==ALL_RECORDS){//判断是否需要处理,只有符合的才处理SQLiteDatabase db = dh.getWritableDatabase();ret = db.update("tbl_user",values,selection, selectionArgs);}else if(sMatcher.match(uri)==SINGLE_RECORD){//这里应该处理带id的uri,省略了.....}return ret;}
删除功能的简单实现
java代码: 查看 复制到剪贴板 打印
- publicintdelete(Uriuri,Stringselection,String[]selectionArgs){
- intret=0;
- if(sMatcher.match(uri)==ALL_RECORDS){
- //判断是否需要处理,只有符合的才处理
- SQLiteDatabasedb=dh.getWritableDatabase();
- ret=db.delete("tbl_user",selection,selectionArgs);
- }elseif(sMatcher.match(uri)==SINGLE_RECORD){//这里应该处理带id的uri,省略了.....}
- returnret;
- }
public int delete(Uri uri, String selection, String[] selectionArgs) {int ret = 0;if(sMatcher.match(uri)==ALL_RECORDS){//判断是否需要处理,只有符合的才处理SQLiteDatabase db = dh.getWritableDatabase();ret = db.delete("tbl_user", selection, selectionArgs);}else if(sMatcher.match(uri)==SINGLE_RECORD){//这里应该处理带id的uri,省略了.....}return ret;}
getType的简单实现,getType方法返回数据的MIME type
java代码: 查看 复制到剪贴板 打印- publicStringgetType(Uriuri){
- switch(sMatcher.match(uri)){
- caseALL_RECORDS:
- return"vnd.android.cursor.dir/vnd.cn.javass.users";
- caseSINGLE_RECORD:
- return"vnd.android.cursor.item/vnd.cn.javass.users";
- default:
- thrownewIllegalArgumentException("unknownURI"+uri);
- }
- }
public String getType(Uri uri) {switch (sMatcher.match(uri)) { case ALL_RECORDS: return "vnd.android.cursor.dir/vnd.cn.javass.users"; case SINGLE_RECORD: return "vnd.android.cursor.item/vnd.cn.javass.users"; default: throw new IllegalArgumentException("unknown URI " + uri);}}
onCreate方法的简单实现
java代码: 查看 复制到剪贴板 打印
- publicbooleanonCreate(){
- if(mContext==null){mContext=this.getContext();}
- if(dh==null){
- dh=newDBHelper(mContext,"testDB1",null,1);
- }
- returntrue;
- }
public boolean onCreate() {if (mContext == null) {mContext = this.getContext();}if(dh==null){dh = new DBHelper(mContext,"testDB1",null,1);}return true;}
使用自己的Content Provider
有了自己实现的Content Provider后,要使用就很简单了。首先要在AndroidManifest.xml文件中注册自己的Content Provider,示例如下:
java代码: 查看 复制到剪贴板 打印
- <providerandroid:name=".MyCP"
- android:authorities="cn.javass.mycp"></provider>
<provider android:name=".MyCP" android:authorities="cn.javass.mycp"></provider>
使用新增的功能,先示范单条新增:
java代码: 查看 复制到剪贴板 打印
- ContentValuesvalues=newContentValues();
- values.put(MyCP.COLUMN_UUID,"test1");
- values.put(MyCP.COLUMN_NAME,"cc1");
- Uriuri=getContentResolver().insert(MyCP.CONTENT_URI,values);
ContentValues values = new ContentValues();values.put(MyCP.COLUMN_UUID, "test1");values.put(MyCP.COLUMN_NAME,"cc1");Uri uri = getContentResolver().insert(MyCP.CONTENT_URI, values);
还可以使用批处理的方式来使用新增的功能,示例如下:
java代码: 查看 复制到剪贴板 打印
- ArrayList<ContentProviderOperation>ops=newArrayList<ContentProviderOperation>();
- ops.add(ContentProviderOperation.newInsert(MyCP.CONTENT_URI)
- .withValue(MyCP.COLUMN_UUID,"test2")
- .withValue(MyCP.COLUMN_NAME,"cc2")
- .build());
- ops.add(ContentProviderOperation.newInsert(MyCP.CONTENT_URI)
- .withValue(MyCP.COLUMN_UUID,"test3")
- .withValue(MyCP.COLUMN_NAME,"cc3")
- .build());
- try{
- getContentResolver().applyBatch(MyCP.URI_AUTHORITY,ops);
- }catch(Exceptione){
- e.printStackTrace();
- }
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();ops.add(ContentProviderOperation.newInsert(MyCP.CONTENT_URI).withValue(MyCP.COLUMN_UUID, "test2").withValue(MyCP.COLUMN_NAME, "cc2").build());ops.add(ContentProviderOperation.newInsert(MyCP.CONTENT_URI).withValue(MyCP.COLUMN_UUID, "test3").withValue(MyCP.COLUMN_NAME, "cc3").build());try {getContentResolver().applyBatch(MyCP.URI_AUTHORITY,ops);} catch (Exception e) {e.printStackTrace();}
使用查询的功能:
java代码: 查看 复制到剪贴板 打印
- Cursorc=getContentResolver().query(MyCP.CONTENT_URI,
- newString[]{MyCP.COLUMN_UUID,MyCP.COLUMN_NAME},null,null,null);
- while(c.moveToNext()){
- StringdId=""+c.getString(c.getColumnIndex(MyCP.COLUMN_UUID));
- Stringname=c.getString(c.getColumnIndex(MyCP.COLUMN_NAME));
- Log.i("nowquery","dataId="+dId+",name="+name);
- }
Cursor c = getContentResolver().query(MyCP.CONTENT_URI, new String[] {MyCP.COLUMN_UUID, MyCP.COLUMN_NAME}, null,null, null);while (c.moveToNext()) {String dId = ""+c.getString(c.getColumnIndex(MyCP.COLUMN_UUID));String name = c.getString(c.getColumnIndex(MyCP.COLUMN_NAME));Log.i("now query","dataId="+dId+",name="+name);}
使用修改的功能,这里只示例单条的处理,批处理的方式参见前面新增的实现:
java代码: 查看 复制到剪贴板 打印
- ContentValuesvalues=newContentValues();
- values.put(MyCP.COLUMN_UUID,"test1");
- values.put(MyCP.COLUMN_NAME,"cc1update");
- getContentResolver().update(MyCP.CONTENT_URI,values,MyCP.COLUMN_UUID+"=?",newString[]{"test1"});
ContentValues values = new ContentValues();values.put(MyCP.COLUMN_UUID, "test1");values.put(MyCP.COLUMN_NAME,"cc1update");getContentResolver().update(MyCP.CONTENT_URI, values,MyCP.COLUMN_UUID+"=?",new String[]{"test1"});
使用删除的功能:
java代码: 查看 复制到剪贴板 打印
- getContentResolver().delete(MyCP.CONTENT_URI,MyCP.COLUMN_UUID+"=?",newString[]{"test2"});
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代码: 查看 复制到剪贴板 打印
- getContext().getContentResolver().notifyChange(Uri,null);
getContext().getContentResolver().notifyChange(Uri, null);
操作通讯录
要使用其他应用提供的Content Provider是非常简单的,只需要获取ContentResolver对象,然后使用它的方法操作数据即可。 这里以最常见的功能:操作通讯录 为例来示范如何使用Content Provider。 记得添加操作Contacts需要的权限java代码: 查看 复制到剪贴板 打印
- <uses-permissionandroid:name="android.permission.WRITE_CONTACTS"/>
- <uses-permissionandroid:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/><uses-permission android:name="android.permission.READ_CONTACTS"/>
先看看新增的功能实现,先以单独操作的方式来示范:
java代码: 查看 复制到剪贴板 打印
- //1:添加原始的帐号信息
- ContentValuesvalues=newContentValues();
- values.put(RawContacts.ACCOUNT_TYPE,"userAccount");
- values.put(RawContacts.ACCOUNT_NAME,"cc");
- UrirawContactUri=getContentResolver().insert(RawContacts.CONTENT_URI,values);
- longrawContactId=ContentUris.parseId(rawContactUri);
- //2:添加账户人员的姓名
- values.clear();
- values.put(Data.RAW_CONTACT_ID,rawContactId);
- values.put(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE);
- values.put(StructuredName.DISPLAY_NAME,"cc1Name");
- getContentResolver().insert(Data.CONTENT_URI,values);
//1:添加原始的帐号信息ContentValues values = new ContentValues();values.put(RawContacts.ACCOUNT_TYPE, "userAccount");values.put(RawContacts.ACCOUNT_NAME, "cc");Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values);long rawContactId = ContentUris.parseId(rawContactUri);//2:添加账户人员的姓名values.clear();values.put(Data.RAW_CONTACT_ID, rawContactId);values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);values.put(StructuredName.DISPLAY_NAME, "cc1Name");getContentResolver().insert(Data.CONTENT_URI, values);
java代码: 查看 复制到剪贴板 打印
- //3:添加电话信息
- values.clear();
- values.put(Data.RAW_CONTACT_ID,rawContactId);
- values.put(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE);
- values.put(Phone.NUMBER,"13567890987");
- values.put(Phone.TYPE,Phone.TYPE_CUSTOM);
- values.put(Phone.LABEL,"cc1");
- UridataUri=getContentResolver().insert(Data.CONTENT_URI,values);
- //同理,还可以添加Email等等信息
//3:添加电话信息values.clear();values.put(Data.RAW_CONTACT_ID, rawContactId);values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);values.put(Phone.NUMBER, "13567890987");values.put(Phone.TYPE, Phone.TYPE_CUSTOM);values.put(Phone.LABEL, "cc1");Uri dataUri = getContentResolver().insert(Data.CONTENT_URI,values);//同理,还可以添加Email等等信息
新增的功能实现,以批处理操作的方式来示范:
前面第一步,添加原始的帐号信息的过程是一样的,批处理最好用在后面都是对Data进行操作的过程中,示例如下:java代码: 查看 复制到剪贴板 打印
- ArrayList<ContentProviderOperation>ops=newArrayList<ContentProviderOperation>();
- ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
- .withValue(Data.RAW_CONTACT_ID,rawContactId)
- .withValue(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE)
- .withValue(StructuredName.DISPLAY_NAME,"cc1Name")
- .build());
- ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
- .withValue(Data.RAW_CONTACT_ID,rawContactId)
- .withValue(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE)
- .withValue(Phone.NUMBER,"13567890989")
- .withValue(Phone.TYPE,Phone.TYPE_CUSTOM)
- .withValue(Phone.LABEL,"cc1").build());
- try{
- getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);
- }catch(Exceptione){
- e.printStackTrace();
- }
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI).withValue(Data.RAW_CONTACT_ID, rawContactId).withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE).withValue(StructuredName.DISPLAY_NAME, "cc1Name").build());ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI).withValue(Data.RAW_CONTACT_ID, rawContactId).withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE).withValue(Phone.NUMBER, "13567890989").withValue(Phone.TYPE, Phone.TYPE_CUSTOM).withValue(Phone.LABEL, "cc1").build());try {getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);} catch (Exception e) {e.printStackTrace();}
查询功能的实现,示例如下:
java代码: 查看 复制到剪贴板 打印
- //1:得到要操作的原始帐号信息
- Cursorc=getContentResolver().query(RawContacts.CONTENT_URI,
- newString[]{RawContacts._ID},RawContacts.ACCOUNT_NAME+"=?",newString[]{"cc"},null);
- longrawContactId=0L;
- while(c.moveToNext()){
- rawContactId=c.getLong(c.getColumnIndex(RawContacts._ID));
- }
- c.close();
- //然后开始获取你需要的数据,这里示范读取电话数据,同理可以读取其他的数据,如Email数据
- c=getContentResolver().query(Data.CONTENT_URI,
- newString[]{Data._ID,Phone.NUMBER,Phone.TYPE,Phone.LABEL},
- Data.RAW_CONTACT_ID+"=?"+"and"+Data.MIMETYPE+"='"+Phone.CONTENT_ITEM_TYPE+"'",
- newString[]{""+rawContactId},null);
- while(c.moveToNext()){
- StringdId=""+c.getInt(c.getColumnIndex(Data._ID));
- Stringname=c.getString(c.getColumnIndex(Phone.LABEL));
- Stringnum=c.getString(c.getColumnIndex(Phone.NUMBER));
- Stringtype=c.getString(c.getColumnIndex(Phone.TYPE));
- Log.i("nowquery","dataId="+dId+",name="+name+",name="+num+",type="+type);
- }
//1:得到要操作的原始帐号信息Cursor c = getContentResolver().query(RawContacts.CONTENT_URI,new String[]{RawContacts._ID},RawContacts.ACCOUNT_NAME+"=? ",new String[]{"cc"}, null);long rawContactId = 0L;while(c.moveToNext()){rawContactId = c.getLong(c.getColumnIndex(RawContacts._ID));}c.close();//然后开始获取你需要的数据,这里示范读取电话数据,同理可以读取其他的数据,如Email数据c = getContentResolver().query(Data.CONTENT_URI, new String[] {Data._ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL},Data.RAW_CONTACT_ID+"=?"+" and "+Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'", new String[]{""+rawContactId}, null);while (c.moveToNext()) {String dId = ""+c.getInt(c.getColumnIndex(Data._ID));String name = c.getString(c.getColumnIndex(Phone.LABEL));String num = c.getString(c.getColumnIndex(Phone.NUMBER));String type = c.getString(c.getColumnIndex(Phone.TYPE));Log.i("now query","dataId="+dId+",name="+name+",name="+num+", type="+type);}
修改功能的实现,示例如下:
java代码: 查看 复制到剪贴板 打印
- //1:应该要先得到要修改的Data数据,这里为了示范简单,就直接改了
- //2:设置修改的值
- ContentValuesvalues=newContentValues();
- values.put(Data.RAW_CONTACT_ID,3);//测试时的数据是3
- values.put(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE);
- values.put(Phone.NUMBER,“13567890981”);//修改了
- values.put(Phone.TYPE,Phone.TYPE_CUSTOM);
- values.put(Phone.LABEL,“upuser1”);//修改了
- getContentResolver().update(Data.CONTENT_URI,values,
- Data._ID+"=?",
- newString[]{“31”});//测试时的id是31
//1:应该要先得到要修改的Data数据,这里为了示范简单,就直接改了 //2:设置修改的值ContentValues values = new ContentValues();values.put(Data.RAW_CONTACT_ID, 3);//测试时的数据是3values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);values.put(Phone.NUMBER, “13567890981”);//修改了values.put(Phone.TYPE, Phone.TYPE_CUSTOM);values.put(Phone.LABEL, “upuser1”);//修改了 getContentResolver().update(Data.CONTENT_URI, values,Data._ID + "=?",new String[] { “31” });//测试时的id是31修改也可以使用批处理的功能来实现,可以参考前面新增的批处理实现。
删除功能的实现,示例如下:
java代码: 查看 复制到剪贴板 打印
- //1:应该要先得到要删除的Data数据,这里为了示范简单,就直接改了
- //2:删除数据,直接删除原始的内容
- getContentResolver().delete(RawContacts.CONTENT_URI,Data._ID+"=?",
- newString[]{"31"});
//1:应该要先得到要删除的Data数据,这里为了示范简单,就直接改了//2:删除数据,直接删除原始的内容getContentResolver().delete(RawContacts.CONTENT_URI, Data._ID + "=?",new String[] { "31" });只要删除了原始的帐号数据,那么所有与它附属的数据,比如电话、Email等都会被自动删除。如果一个Contact对应的所有原始帐号数据都被删除掉了,那么Contact会被自动删除掉。
更多相关文章
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
- 一句话锁定MySQL数据占用元凶
- Android中SQLite数据库介绍和使用
- Android的App列表之拖拽ListView(上)
- 微软Webcast课程下载软件iReaper正式登陆Android平台
- Sqlite的使用和一个简单的书籍管理系统(上)
- android 组件化架构读书笔记(六)数据存储
- 视频教程-Matplotlib 数据分析可视化-Python
- Android(安卓)开发艺术探索之---ContentProvider(内容提供者)