- 浏览: 547613 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
北月与南安:
哥哥不要秀我,答案是11.38,你算出来36.43,要求N个点 ...
平均距离 -
xiao_android_jun:
[color=red][ size=xx-small ...
Android 之 进程的概念介绍 -
明子健:
小伙子,很有前途哦
《将博客搬至CSDN》 -
1140566087:
dugujiujian 写道R.layout.simple_s ...
Android 之 下拉(Spinner) 组件示例 -
dugujiujian:
R.layout.simple_spinner_dropdow ...
Android 之 下拉(Spinner) 组件示例
1、使用ContentProvider 共享数据:
ContentProvider 类主要方法的作用如下:
* public boolean onCreate(); -该方法在ContentProvider 创建后就会被调用,Android开机后,ContentProvider
在其它应用第一次访问时才会被创建;
* public Uri insert(Uri uri,ContentValues values);
-该方法用于外部应用往ContentProvider添加数据;
* public int delete(Uri uri ,String selection,String[] selectionArgs);
-该方法用于外部应用从ContentProvider删除数据;
* public int update(Uri uri ,ContentValues values ,String selection,String[] selectionArgs);
-该方法用于外部应用更新ContenProvider数据;
* public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder);
-该方法用于外部应用从ContentProvider获取数据;
* public String getType(Uri uri);
-该方法用于返回当前Url 所代表数据的MIME类型,
1.2 public String getType(Uri uri);该方法的使用介绍:
该方法用于返回当前Url所代表数据的MIME类型。如果操作的数据属于集合类型,那么MIME类型字符串
应该以vnd.android.cursor.dir/开头;
例如:要得到所有person记录的 Uri为content://cn.itcast.provider.personprovider/person,那
么返回的MIME类型字符串应该为:vnd.android.cursor.dir/person。
如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头;
例如:得到id为10的person的记录,Uri为:content://cn.itcast.provider.personprovider/person/10,
那么返回的MIME类型字符串应该为:vnd.android.cursor.item/person;
2、使用ContentResolver操作ContentProvider中的数据:
* 工具类:ContentResolver
当外部的应用需要对ContentProvider中的数据进行添加、删除、修改和查询的操作时,可以使用ContentResolver类
来完成,要获取ContentResolver对象,可以使用Activity提供的getContentResolver()方法;ContentResolver提
供了与ContentProvider类相同签名的四个方法:
* public Uri insert(Uri uri,ContentValues values);
-往ContentProvider中添加数据;
* public int delete(Uri uri,String selection ,String[] selectionArgs);
-从ContentProvider中删除数据;
* public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs);
-更行ContentProvider中的数据;
* public Cursor query(Uri uri,String[] projectionm,String selection ,String[] selectionArgs,String sortOrder);
-该方法用于从Content中获取数据;
【注:以上所有方法的第一个参数Uri,代表要操作的ContentProvider和对其中的什么数据进行操作;】
例如:Uri.parse("content://cn.itcast.providers.personprovider/person/10");
表示:对主机名为:cn.itcast.providers.personprovider的ContentProvider进行操作,操作数据表person中id为
10的记录;
案例:模拟通讯录的操作:添加数据,删除,修改,查看;
使用小贴士:
首先:加入读写联系人信息的权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
需要使用到的Uri:
content://com.android.contacts/contacts 操作的数据是联系人的Uri;
content://com.android.contacts/data/phone 联系人电话Uri;
content://com.android.contacts/data/emails 联系人Email Uri;
注:表中不同的MIME,对应的Uri是不同的,如需获取对应类型的信息,那么Uri必须相对应;
具体实现代码:
ContentProvider 类主要方法的作用如下:
* public boolean onCreate(); -该方法在ContentProvider 创建后就会被调用,Android开机后,ContentProvider
在其它应用第一次访问时才会被创建;
* public Uri insert(Uri uri,ContentValues values);
-该方法用于外部应用往ContentProvider添加数据;
* public int delete(Uri uri ,String selection,String[] selectionArgs);
-该方法用于外部应用从ContentProvider删除数据;
* public int update(Uri uri ,ContentValues values ,String selection,String[] selectionArgs);
-该方法用于外部应用更新ContenProvider数据;
* public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder);
-该方法用于外部应用从ContentProvider获取数据;
* public String getType(Uri uri);
-该方法用于返回当前Url 所代表数据的MIME类型,
1.2 public String getType(Uri uri);该方法的使用介绍:
该方法用于返回当前Url所代表数据的MIME类型。如果操作的数据属于集合类型,那么MIME类型字符串
应该以vnd.android.cursor.dir/开头;
例如:要得到所有person记录的 Uri为content://cn.itcast.provider.personprovider/person,那
么返回的MIME类型字符串应该为:vnd.android.cursor.dir/person。
如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头;
例如:得到id为10的person的记录,Uri为:content://cn.itcast.provider.personprovider/person/10,
那么返回的MIME类型字符串应该为:vnd.android.cursor.item/person;
2、使用ContentResolver操作ContentProvider中的数据:
* 工具类:ContentResolver
当外部的应用需要对ContentProvider中的数据进行添加、删除、修改和查询的操作时,可以使用ContentResolver类
来完成,要获取ContentResolver对象,可以使用Activity提供的getContentResolver()方法;ContentResolver提
供了与ContentProvider类相同签名的四个方法:
* public Uri insert(Uri uri,ContentValues values);
-往ContentProvider中添加数据;
* public int delete(Uri uri,String selection ,String[] selectionArgs);
-从ContentProvider中删除数据;
* public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs);
-更行ContentProvider中的数据;
* public Cursor query(Uri uri,String[] projectionm,String selection ,String[] selectionArgs,String sortOrder);
-该方法用于从Content中获取数据;
【注:以上所有方法的第一个参数Uri,代表要操作的ContentProvider和对其中的什么数据进行操作;】
例如:Uri.parse("content://cn.itcast.providers.personprovider/person/10");
表示:对主机名为:cn.itcast.providers.personprovider的ContentProvider进行操作,操作数据表person中id为
10的记录;
案例:模拟通讯录的操作:添加数据,删除,修改,查看;
使用小贴士:
首先:加入读写联系人信息的权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
需要使用到的Uri:
content://com.android.contacts/contacts 操作的数据是联系人的Uri;
content://com.android.contacts/data/phone 联系人电话Uri;
content://com.android.contacts/data/emails 联系人Email Uri;
注:表中不同的MIME,对应的Uri是不同的,如需获取对应类型的信息,那么Uri必须相对应;
具体实现代码:
package com.svse.contentprovider; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.RawContacts; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { private Button insert ,delete,update,read; protected void init(){ insert = (Button) findViewById(R.id.insertContact); delete = (Button) findViewById(R.id.deleteContacts); update = (Button) findViewById(R.id.updateContacts); read = (Button) findViewById(R.id.readContact); } protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /* 初始化组件对象 */ init(); /* 为read设置按钮点击事件监听器 */ read.setOnClickListener(new OnClickListener() { public void onClick(View v) { readContacts(); } }); insert.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub insertContacts(); } }); delete.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub deleteContacts(); } }); update.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //updateContacts(); } }); } /* 读取联系人信息 */ public void readContacts(){ /* 获取ContentResolver对象,使用getContentResolver()方法 */ ContentResolver cr = this.getContentResolver(); /**************************************联系人信息**********************************************/ /* 执行查询操作,使用query();方法 */ /* 参数说明: * @ uri : 操作ContentProvider的Uri; * @ projection :查询的列; * @ selecion :查询条件; * @ selectionArgs :条件对应参数; * @ sortOrder :排序方式; */ /* 获取联系人信息: Uri:ContactsContract.Contacts.CONTENT_URI*/ Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); /* 操作游标,获取数据 */ for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){ /* 保存当前联系人的所有信息 */ StringBuffer sb = new StringBuffer(); /* 获取联系人ID */ String contactID = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); sb.append("ID:"+contactID+"\n"); /* 获取联系人姓名 */ String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); sb.append("姓名:"+name+"\n"); /**********************************************************************************************/ /* 通讯录 表 的特点:保存数据是按行保存,即:每个数据信息占一行,每行中该种属性能有多个值: * 例如 : 一个人的电话号码能有多个;即:一个contactID下有多个phone; */ /**********************************************************************************************/ /****************************获取电话号码*********************************************/ //ContactsContract.CommonDataKinds.Phone.CONTENT_URI 获取Phone对应MIME类型的Uri; //ContactsContract.CommonDataKinds.Phone.CONTACT_ID 获取表中的联系人ID; Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"=?", new String[]{contactID}, null); while(phone.moveToNext()){ String phoneNumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); sb.append("phone:"+phoneNumber+"\n"); //Toast.makeText(MainActivity.this, "_ID="+contactID+" name="+name+" phone:"+phoneNumber, 1000).show(); } /* 游标使用后要关闭 */ phone.close(); /**********************************************************************************************/ /************************************获取Email*************************************************/ Cursor email = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID+"=?", new String[]{contactID},null); while(email.moveToNext()){ String emailAddress = email.getString(email.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); sb.append("emailAddress:"+emailAddress+"\n"); //Toast.makeText(MainActivity.this, "_ID="+contactID+" name="+name+" Email:"+emailAddress, 1000).show(); } email.close(); /**********************************************************************************************/ Toast.makeText(MainActivity.this, sb.toString(), 1000).show(); } cursor.close(); } /* 添加联系人 */ public void insertContacts(){ /*************************************方式一*******************************************************/ /* 首先:需要向RawContacts.CONTENT_URI 执行一个空值的插入,目的是获取系统返回的rawConatactId , * 这是后面插入data表的依据,只有执行空值的插入,才能使插入的联系人在通讯录里可见*/ ContentValues values = new ContentValues(); /* 向 RawContacts.CONTENT_URI执行一个空值的插入,返回rawContactId */ Uri rawContactUri = this.getContentResolver().insert(RawContacts.CONTENT_URI, values); /* 从Uri路径中获取 ID 的部分 */ long rawContactId = ContentUris.parseId(rawContactUri); values.clear(); /* data表中的数据结构特点:每个数据信息以行进行保存,所以每次添加一行数据 */ /* 向data表中插入姓名 */ values.put(Data.RAW_CONTACT_ID, rawContactId); //ID values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); //内容的类型 values.put(StructuredName.GIVEN_NAME, "张三峰"); this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values); values.clear(); /* 向data表中插入移动电话 */ values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); values.put(Phone.NUMBER, "15337178625"); values.put(Phone.TYPE, Phone.TYPE_MOBILE); //电话的类型:工作电话 移动电话 家庭电话 this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values); values.clear(); /* 向data表中插入工作电话 */ values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); values.put(Phone.NUMBER, "02787878989"); values.put(Phone.TYPE, Phone.TYPE_WORK); //电话的类型:工作电话 移动电话 家庭电话 this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values); values.clear(); /* 向data表中添加Email */ values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); values.put(Email.DATA, "15337178625@qq.com"); values.put(Email.TYPE, Email.TYPE_WORK); //电话的类型:工作电话 移动电话 家庭电话 this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values); values.clear(); Toast.makeText(MainActivity.this, "数据添加成功!", 1000).show(); /********************************************************************************************************/ /*********************************方式二:批量添加,处于同一个事务**************************************/ } /* 删除 */ public void deleteContacts(){ /* 首先获取CotentResolver对象,用于操作ContentProvider */ ContentResolver cr = this.getContentResolver(); /* 思路:删除一个联系人的所有,则根据RAW_CONTACT_ID进行删除 */ cr.delete(RawContacts.CONTENT_URI, RawContacts.CONTACT_ID+"=?", new String[]{"1"}); Toast.makeText(MainActivity.this, "数据删除成功", 1000).show(); } // // /* 修改 */ // public void updateContacts(){ // ContentResolver cr = this.getContentResolver(); // // /* 获取ID,需要修改的联系人ID,然后确定修改信息 */ // ContentValues values = new ContentValues(); // values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);//值的类型 // values.put(StructuredName.GIVEN_NAME, "张无忌"); // cr.update(ContactsContract.Contacts.CONTENT_URI, values, ContactsContract.Data.DISPLAY_NAME+"=?", new String[]{"张三峰"}); // Toast.makeText(MainActivity.this, "修改成功", 1000).show(); // readContacts(); // } // /* UriMathcer 类的用法 */ public void uriMatcher(){ /* 常量UriMatche.NO_MATCH 标示部匹配任何路径的返回码 */ UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH); /* 如果match()方法匹配content://cn.itcast.provider.personprovider/person 路径, * 返回匹配码为 1 */ /* 添加需要匹配的URL ,如果匹配就会返回匹配码 */ sMatcher.addURI("cn.itcast.provider.personprovider", "person", 1); /* # 为通配符 *//* match():方法匹配:content://cn.itcast.provider.personprovider/person/230 * 路径, 返回匹配码2 * */ sMatcher.addURI("cn.itcast.provider.personprovider", "person/#", 2); /* 按上述添加的规则进行匹配,不同的路径匹配返回不同的匹配码 */ int code = sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10")); /**********************************************************************/ //ContentUris 的介绍 /* 将字符串转换成Uri */ Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person"); /* 为路径添加ID部分 */ Uri resultUri = ContentUris.withAppendedId(uri, 10); } }
发表评论
-
Android 之 网络访问服务器,解析JSON数据
2014-03-28 22:50 3339提示:在访问网络,或者服务器的数据一定要注意 网络权限的声明: ... -
Android 之 AsyncTask 异步任务
2014-03-20 08:44 3479Android ... -
Android 之 Looper Handler Message 之间的关系
2014-03-19 10:16 3612Android 的消息 ... -
Android 之 多线程与Socket联合使用案例
2014-03-19 10:15 2603多线 ... -
Android 之 多线程和Socket套接字的使用介绍
2014-03-19 10:15 4817And ... -
Android 之 实现Runnable 接口与继承Thread的区别
2014-03-19 10:15 2152实现Runnable 接口 相 ... -
Android 之 GSON解析JSON数据
2014-03-19 10:14 4424... -
Android 之 使用Pull 解析xml文件
2014-03-18 21:04 999/** * 使用Pull进行 xml 文件的解析 ... -
Android 之 使用DOM解析xml文件
2014-03-18 21:02 2693DOM 解析 xml 格式的文件 1、 xml简介:xml ... -
Android 之 百度API 密钥安全码生成
2014-03-04 22:29 2330近期要做个关于旅游助手的应用,开始接触百度API了。大神们 ... -
Android 之 EditText属性用法介绍
2014-01-06 23:49 3946EditText的属性 EditText继承关系:View-- ... -
Android 之 自定义适配器
2014-01-08 10:40 1704自定义适配器 1、实现 * 自定义适配器要继承 BaseA ... -
Android 之 自定义控件用法介绍
2014-01-08 10:40 1681自定义效果:实现:图片和文字混合 首先创建需要组合的子布局: ... -
Android 之 资源自适应与国际化
2014-01-08 10:40 3018<!-- 国际化和资源自适应 ... -
Android 之 Parcelable 序列化
2014-01-08 10:41 2652/* 序列化 * * 作 ... -
Android 之 五大布局案例
2014-01-08 10:41 20961、LinearLayout 线性布局例子: <Lin ... -
Android 之 通知Notification
2014-03-03 22:30 3821Notification 和 NotificationMana ... -
Android 之 手机全屏显示
2014-03-03 22:30 2281/* 1、全屏状态的显示 介绍:Android 中提供了Wi ... -
Android 之 拦截手机短信并自动转发
2014-03-03 22:29 5436拦截短信和发送短信都需要相关的权限: <?xml ve ... -
Android 之 将RAW资源文件写入SD卡工具类
2014-03-01 10:09 3513package com.sun.coptfiletosd; ...
相关推荐
Android高级编程雪梨作业之自定义ContentProvider 将任务01生词本作业中生成的生词本数据库通过自定义ContentProvider的方式,共享给其他应用。 要求如下: (1) 使用自定义SQLiteOpenHelper来管理数据库; (2) 提交...
contentprovider实现数据库的增,删,改,查,自定义组件显示
Android中用ContentProvider快速查找通讯录信息的代码清单.pdf 学习资料 复习资料 教学资源
使用Android提供的contentprovider操作数据库的demo。
利用ContentProvider操作数据库,新建Testcase,并用Listview显示查询到的所有Testcase。
android中使用contentprovider编写简单的通讯录的简单实例 希望能给大家帮助
采用ContentProvider实现android sqlite数据库的共享,包含了本项目对数据库的访问和第三方项目(新建项目)对数据库的访问。
Android中用ContentProvider快速查找通讯录信息的任务说明.pdf 学习资料 复习资料 教学资源
简单介绍了android四大组件中最难的contentP人oviDer组件中对于通讯录所在数据库的查询和添加操作。
本示例结合ContentProvider实现了数据库的增删改查操作 并且扩展性比较好
两个apk之间通过Broadcast,BroadcastReceiver广播互相通信及ContentProvider监听数据库增删改查的变换
学习ContentProvider的练习-手机通讯录的查询和添加,删除。(删除功能不够彻底)
ContentProvider 共享SharedPreferences 值
从头学Android之ContentProvider示例源代码
使用ContentProvider开放数据库,其他应用可以通过ContentResolver来操作提供共享的数据库。
ContentProvider数据共享的基本使用方法
1、Android Room操作SQLite数据 2、ContentProvider使用,使用Room进行数据库操作
关于android的数据存储-SQLite-ContentProvider-preferences
博客《ContentProvider数据库共享之 实例讲解》对应源码 博客地址:http: blog csdn net harvic880925 article details 44591631
Android应用开发使用ContentProvider以及SQLite实现对数据库的相关操作,可以直接操作数据库,也可以使用ContentProvider来对数据库进行间接操作。