- 浏览: 131490 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
zfcejb:
你好,这X-gen有源码参考吗
X-gen PPT下载——《研磨设计模式》 实战 -
1927105:
LZ研究过Hibernate4里的监听时间吗?我这边用4.3. ...
Hibernate4实战 之第六部分:基本实现原理 -
hbbbs:
看介绍 挺美的!
X-gen PPT下载——《研磨设计模式》 实战 -
jenmhdn:
即这个是综合运用设计模式的
X-gen PPT下载——《研磨设计模式》 实战 -
jenmhdn:
很值得一看
X-gen PPT下载——《研磨设计模式》 实战
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代码:
- 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代码:
- 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代码:
查询功能的简单实现
java代码:
- 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代码:
- 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代码:
- 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代码:
onCreate方法的简单实现
java代码:
使用自己的Content Provider
有了自己实现的Content Provider后,要使用就很简单了。首先要在AndroidManifest.xml文件中注册自己的Content Provider,示例如下:
使用新增的功能,先示范单条新增:
还可以使用批处理的方式来使用新增的功能,示例如下:
java代码:
- 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代码:
- 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代码:
使用删除的功能:
几点说明
1:这里创建的自己的Content Provider是非常简单的,主要是沿用了前面SQLite的示例,当然也可以使用文件操作的示例
2:一般来说,提供Content Provider的数据,应该有一个long型的id字段,由于前面的示例没有,所以上面的示例没有提供
3:在自己的Content Provider实现里面,应该根据Uri是否带有id的情况进行相应的处理,为了示例的简单,就没有那么实现了
4:由于Content Provider可能被多个应用同时使用,因此需要在实现Content Provider的时候进行多线程控制,目前并没有实现这样的功能
5:处理多线程的一个好方式就是,当数据发生改变的时候,通知所有相关的数据改变,比如在新增、修改、删除方法里面提供:
操作通讯录
要使用其他应用提供的Content Provider是非常简单的,只需要获取ContentResolver对象,然后使用它的方法操作数据即可。
这里以最常见的功能:操作通讯录 为例来示范如何使用Content Provider。
记得添加操作Contacts需要的权限
先看看新增的功能实现,先以单独操作的方式来示范:
java代码:
- //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");
- Uri dataUri = getContentResolver().insert(Data.CONTENT_URI,values);
- //同理,还可以添加Email等等信息
新增的功能实现,以批处理操作的方式来示范:
前面第一步,添加原始的帐号信息的过程是一样的,批处理最好用在后面都是对Data进行操作的过程中,示例如下:
java代码:
- 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:得到要操作的原始帐号信息
- 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:设置修改的值
- ContentValues values = new ContentValues();
- 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 + "=?",
- new String[] { “31” });//测试时的id是31
修改也可以使用批处理的功能来实现,可以参考前面新增的批处理实现。
删除功能的实现,示例如下:
只要删除了原始的帐号数据,那么所有与它附属的数据,比如电话、Email等都会被自动删除。如果一个Contact对应的所有原始帐号数据都被删除掉了,那么Contact会被自动删除掉。
视频配套PPT,视频地址【 Android4开发入门经典独家视频课程】
发表评论
-
Android4开发入门经典 之 第十二部分:最佳实践
2012-07-24 18:48 1212性能提升 有两个 ... -
Android4开发入门经典 之 第十二部分:最佳实践
2012-07-24 08:40 122性能提升 有两个编写有效代码的基本规则: 1:不 ... -
Android4开发入门经典 之 第十一部分:网络编程
2012-07-21 08:23 1163基于Socket的网络编程 Android ... -
Hibernate4实战 之第五部分:Hibernate的事务和并发
2012-07-11 12:09 822Hibernate本身没有事务 ... -
Android4开发入门经典 之 第十部分:多媒体
2012-07-11 12:08 1349简介 Android的多媒 ... -
Android4开发入门经典 之 第八部分:SQLite
2012-07-09 12:34 920SQLite基本知识 SQLite介绍 SQLi ... -
Android4开发入门经典 之 第七部分(2):数据存储
2012-07-08 08:45 1331数据存储基本知识 ... -
Android4开发入门经典 之 第七部分(1):数据存储
2012-07-08 08:44 1051数据存储基本知识 ... -
Android4开发入门经典 之 第六部分:Broadcast
2012-07-06 20:42 1000Broadcast基本概念 Broadcast是什 ... -
Android4开发入门经典 之 第五部分:Service
2012-07-05 12:42 923Service基本概念 Service是什么 是 ... -
Android4开发入门经典 之 第四部分:用户界面
2012-07-04 07:56 2616基本概念 常用Widgets和布局 常用 ... -
Android4开发入门经典 之 第三部分:Activity
2012-07-03 14:04 1318Activity基本概念 Activity是什 ... -
Android4开发入门经典 之 第二部分:Android应用的核心基础
2012-07-02 07:35 1832Android应用中的组件 Applicati ... -
跟我学Android4 之 第一部分:Android入门基础
2012-06-30 08:09 3120Android是什么 Android是一个针对移动 ...
相关推荐
第一讲:Android开发环境的搭建 第二讲:Android系统构架分析和应用程序目录结构分析 第三讲:Android模拟器的使用 emulator 第四讲:Activity入门指南 Activity 第五讲:用户界面 View(一) FrameLayout, ...
博文《android基础知识05:四大组件之content provider》的示例程序,实现了content provider 的基本功能。
两个java库,Unity发布安卓项目经常会有需要。 发包时遇到报错: Didn't find class "androidx.core.content.FileProvider" on path... ...<provider android:name="androidx.core.content.FileProvider
Android Content Provider Demo
1、什么是内容提供者 2、怎样创建内容提供者 3、通过内容提供者完成CRUD操作 4、访问内容提供者 5、监听内容提供者数据变化 6、两个案例:监听短信以及操作联系人 最最重要的是包含了源码
本书内容上涵盖了用android开发的大部分场景,从android基础介绍、环境搭建、sdk介绍、market使用,到应用剖析、组件介绍、实例演示等方面。从技术实现上,讲解了5个android平台下的完整综合实例及源代码分析,...
理解Content Uri的概念和作用,掌握通过Content Provider访问联系人的方法,掌握通过Content Provider访问通话记录的方法,掌握通过Content Provider访问短信的方法。
NULL 博文链接:https://dampce032.iteye.com/blog/975663
4 播放课后练习查看答案 相关技术及应用 Android 应用开发实践 第十九节:Content Provider(三) 5 播放课后练习查看答案 相关技术及应用 Android 应用开发实践 第二十一节:Broadcast Receiver和Notification(一...
【第一版第九章】老罗Android开发视频--存储数据和文件(7集) 【第一版第十章】老罗Android开发视频--对话框介绍(4集) 【第一版第十一章】老罗Android开发视频--通知的使用(2集) 【第一版第十二章】老罗...
第8章 Android广播事件处理 Broadcast Receiver 第9章 Android中的数据存取 第10章 Content Provider 第11章 Android中的多媒体应用 第12章 Android中的图形图像 第13章 Android中的互联网应用 第14章 Android中的...
《Android开发案例驱动教程》部分源码 目 录 出版说明 前言 第1章 Android操作系统概述 1 第2章 Android开发环境搭建 3章 第一个Android程序 19 第4章 Android UI基础 58 第5章 UI基础控件 79 第6章 UI高级控件 105 ...
这是在Eclipse环境下开发的android应用程序,主要是实现了在室内定位,获取所在地的经纬度信息
第9章 Activity和Intent 219 第10章 Android数据存储 248 第11章 Content Provider 302 第12章 多媒体开发 341 第13章 Service 385 第14章 Broadcast Receiver和Notification 422 第15章 云端应用 449 第16章 Google...
Android Content Provider用法样例,解析如何使用“内容提供商”Content Provider共享不同应用的数据,本Android例子将使用Content Provider实现了获取联系人信息,里面的注释非常丰富,是学习android的好资料。
《Android高薪之路:Android程序员面试宝典》目录: 第1章 Android入门 1 1 关于Android的非技术问题 1 1 1 为什么看好 Android 1 1 2 以前是否从事过Android的工作 做过哪些工作 1 1 3 你做的最复杂的界面是什么 1 ...
android provider
第9章 Android中的数据存取 Android中的数据存取,讲述了Android的四种数据存取方法:Preference、File、SQLite和Network 第10章 Content Provider Content Provider,讲述了Android不同应用程序之间相互共享数据...
第二部分 基础篇,包括第3章~第16章,第3章 Android程序设计基础、第4章 用户界面开发基础、第5章 控件(Widget)详解、第6章 菜单、第7章 信息提醒(对话框、Toast与Notification)、第8章 数据存储、第9章 Android...