第8章Android内容提供者(ContentProvider)应用.ppt
《第8章Android内容提供者(ContentProvider)应用.ppt》由会员分享,可在线阅读,更多相关《第8章Android内容提供者(ContentProvider)应用.ppt(43页珍藏版)》请在麦多课文档分享上搜索。
1、第8章 Android内容提供者(ContentProvider)应用,网络资源:http:/ ContentProvider简介,ContentProvider是Android四大组件之一,如果要开发自己的ContentProvider必须实现Android系统提供的ContentProvider基类,并且需要在AndroidManifest.xml文件中进行配置。 1、继承ContentProvider并重写增、删、查、改等方法; 2、在AndroidManifest.xml使用对该ContentProvider进行配置。,注意:authorities是必备属性,如果没有authoriti
2、es 属性程序会报错。,ContentProvider基类的常用方法,public abstract boolean onCreate():该方法在ContentProvider创建后调用,当其他应用程序第一次访问ContentProvider时,ContentProvider会被创建,并立即调用该方法; public abstract Cursor query(Uri uri, String projection, String selection, String selectionArgs, String sortOrder):根据Uri查询符合条件的全部记录,其中projection是所
3、需要获取的数据列; public abstract int update(Uri uri,ContentValues values,String select,String selectArgs):根据Uri修改select所匹配的全部记录; public abstract int delete(Uri uri,String selection,String selectionArgs):根据Uri删除符合条件的全部记录; public abstract Uri insert(Uri uri, ContentValues values):根据Uri插入values对应的数据,ContentVa
4、lues类似于map,存放的是键值对; public abstract String getType(Uri uri):该方法返回当前Uri所代表的数据的MIME类型。如果该Uri对应的数据包含多条记录,则MIME类型字符串应该以vnd.android.curor.dir/开头,如果该Uri对应的数据只包含一条记录,则MIME类型字符串应该以vnd.android.cursor.item/开头。,8.2 ContentProvider操作常用类,Uri代表了要操作的数据,Uri主要包含了两部分信息:1、需要操作的ContentProvider;2、对ContentProvider中的什么数据进
5、行操作。 一个Uri由以下几部分组成:,scheme:ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content:/,8.2.1 URI基础,主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。路径(path)用于确定我们要操作该ContentProvider中的什么数据,一个ContentProvider内可能包含多种数据,路径的构建应根据业务而定,例如: 要操作person表中id为10的记录,可以构建这样的路径:/person/10 要操作person表中id为10
6、的记录的name字段,路径为:/person/10/name 要操作person表中的所有记录,可以构建这样的路径:/person 要操作xxx表中的记录,可以构建这样的路径:/xxx,注意:要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式。,ID:该部分是可选的,用于指定操作的具体是哪条记录,如果没有设置,则操作的是所有记录。,8.2.1 URI基础,如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,例如: Uri uri = Uri.parse(“content:/.android.providers.personprovider/person“
7、);,由于Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。,8.2.1 URI基础,UriMatcher类用于匹配Uri,它的用法如下:1、注册所有需要匹配的Uri路径:,2、注册完需要匹配的Uri后,就可以使用myUri.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content:/.providers.myprovider/person
8、路径,返回的匹配码为1。,UriMatcher myUri= new UriMatcher(UriMatcher.NO_MATCH); /创建UriMather对象,常量UriMatcher.NO_MATCH表示不匹配任何路径的 /返回码,该常量值为-1。 myUri.addURI(“.providers.myprovider”, “person”, 1);/添加需匹配的Uri,如果match()方法匹配 ontent:/.providers. /myprovider/person路径,返回匹配码为1。 myUri.addURI(“.providers.myprovider”, “person
9、/#”, 2);/添加需匹配的Uri,#号为通配符,表示匹配任何ID的Uri,如果匹配则返回2,/例如如果匹配content:/.providers.myprovider/person/230 /路径,返回匹配码为2,8.2.2 URI操作类UriMatcher和ContentUris,ContentUris类用于获取Uri路径后面的ID部分,它有两个比较实用的方法:withAppendedId(uri, id)用于为路径加上ID部分:Uri uri = Uri.parse(“content:/.personprovider/person”);Uri resultUri = ContentUr
10、is.withAppendedId(uri, 10); /生成的Uri:为content:/.personprovider/person /10parseId(uri)方法用于从路径中获取ID部分:Uri uri = Uri.parse(“content:/.personprovider/person /10”);long personid = ContentUris.parseId(uri);/获取的结果为:10,8.2.2 URI操作类UriMatcher和ContentUris,ContentProvider的作用是暴露可供操作的数据,其他应用程序主要通过ContentResolver来
11、操作ContentProvider所暴露的数据,ContentResolver相当于客户端。ContentResolver是一个抽象类,是不能直接实例化的,那么我们如何得到ContentResolver实例呢?Android中Context类提供了getContentResolver()方法用于获取ContentResolver对象。然后即可调用其增删查改方法进行数据操作。一般来说,ContentProvider是单例模式的,当多个应用程序通过ContentResolver来操作ContentProvider提供的数据时,ContentResolver调用的数据操作将会委托给同一个Conten
12、tProvider处理。 使用ContentResolver操作数据的步骤:调用Activity的getContentResolver()获取ContentResolver;根据需要调用ContentResolver的insert()、delete()、update()和query()方法操作数据。,8.2.3 ContentResolver类,ContentValues类和Java中的Hashtable类比较相似,都是负责存储一些键值对,但是它存储的键值对当中的键是一个String类型,往往是数据库的某一字段名,而值都是一些简单的数据类型。当我们向数据库中插入一条记录时,可以将这条信息的各个
13、字段值放入ContentValues,然后将该ContentValues直接插入数据库。而不用拼接SQL语句或使用占位符一一赋值。,8.2.3 ContentResolver类,8.3 ContentProvider应用案例,为备忘录添加ContentProvider,以一个具体的示例演示如何创建自己的ContentProvider,我们为备忘录示例创建ContentProvider,使得其他应用程序可以访问和修改它的数据。,向通讯录中添加联系人的事件处理代码,由于通讯录中用户名和号码存放于不同的表中,是根据联系人ID号关联起来的。因此,我们先向联系人中添加一个空的记录,产生新的ID号,然后根
14、据ID号分别在两张表中插入相应的数据。,public void addPerson() String nameStr = name.getText().toString();String numStr = num.getText().toString();ContentValues values = new ContentValues();Uri rawContactUri = resolver.insert(RawContacts.CONTENT_URI, values);long contactId = ContentUris.parseId(rawContactUri);System.o
15、ut.println(contactId);values.clear();,添加联系人,获取联系人姓名,创建一个空的ContentValues,向RawContacts.CONTENT_URI执行一个空值插入,目的是获取返回的ID号,得到新联系人的ID号,获取联系人号码,清空Values的内容,程序清单:AccessContactssrcietjxufecnandroidMainActivity.java,8.3.1 用ContentResolver操纵 ContentProvider提供的数据,values.put(Data.RAW_CONTACT_ID, contactId);values
16、.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);values.put(StructuredName.GIVEN_NAME, nameStr);resolver.insert(android.provider.ContactsContract.Data.CONTENT_URI,values);values.clear();values.put(Data.RAW_CONTACT_ID, contactId);values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);values.put(Phon
17、e.NUMBER, numStr);values.put(Phone.TYPE, Phone.TYPE_MOBILE);resolver.insert(android.provider.ContactsContract.Data.CONTENT_URI,values);Toast.makeText(MainActivity.this, “联系人数据添加成功!“, 1000).show(); ,设置ID号,设置类型,设置姓名,向联系人Uri添加联系人名字,清空Values的内容,设置Id号,设置类型,设置号码,设置电话类型,向联系人电话号码Uri添加电话号码,程序清单:AccessContact
18、ssrcietjxufecnandroidMainActivity.java,8.3.1 用ContentResolver操纵 ContentProvider提供的数据,获取通讯录中所有联系人的姓名和手机号时,首先查询出所有的联系人姓名和他的ID号,然后根据ID号查询电话号码表中的的号码,再将每个人的信息放在同一个map对象中,最后将这个map对象添加到列表中,作为结果返回。程序得到列表后将其与下拉列表控件相关联,从而将数据有规律的显示在我们的界面上。,public ArrayList queryPerson() ArrayList detail = new ArrayList();Curso
19、r cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);while (cursor.moveToNext() Map person = new HashMap();String personId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID);String name = cursor.getString(cursor.getColumnIndex(ContactsContract.
20、Contacts.DISPLAY_NAME);person.put(“id“, personId);person.put(“name“, name);,程序清单:AccessContactssrcietjxufecnandroidMainActivity.java,创建一个保存所有联系人信息的列表,每项是一个map对象,查询通讯录中所有联系人,循环遍历每一个联系人,获取联系人ID号,每个联系人信息用一个map对象存储,获取联系人姓名,将获取到的信息存入map对象中,8.3.1 用ContentResolver操纵 ContentProvider提供的数据,Cursor nums = resol
21、ver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + “=“+ personId, null, null);if(nums.moveToNext()String num = nums.getString(nums.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);person.put(“num“,num);nums.close(); det
22、ail.add(person); cursor.close();System.out.println(detail);return detail;,程序清单:AccessContactssrcietjxufecnandroidMainActivity.java,根据ID号,查询手机号码,将手机号存入map对象中,关闭资源,关闭资源,返回查询列表,8.3.1 用ContentResolver操纵 ContentProvider提供的数据,方法写好后,我们需要在相应的事件处理中调用该方法,代码如下。,MyOnClickListener myOnClickListener = new MyOnCli
23、ckListener();add.setOnClickListener(myOnClickListener);query.setOnClickListener(myOnClickListener);,程序清单:AccessContactssrcietjxufecnandroidMainActivity.java,创建事件监听器,注册事件监听器,注册事件监听器,自定义的事件处理器,针对不同事件调用不同的方法。代码如下。,private class MyOnClickListener implements OnClickListener public void onClick(View v) sw
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ANDROID 内容 提供者 CONTENTPROVIDER 应用 PPT
