- 浏览: 134626 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
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 1243性能提升 有两个 ... -
Android4开发入门经典 之 第十二部分:最佳实践
2012-07-24 08:40 122性能提升 有两个编写有效代码的基本规则: 1:不 ... -
Android4开发入门经典 之 第十一部分:网络编程
2012-07-21 08:23 1192基于Socket的网络编程 Android ... -
Hibernate4实战 之第五部分:Hibernate的事务和并发
2012-07-11 12:09 847Hibernate本身没有事务 ... -
Android4开发入门经典 之 第十部分:多媒体
2012-07-11 12:08 1379简介 Android的多媒 ... -
Android4开发入门经典 之 第八部分:SQLite
2012-07-09 12:34 946SQLite基本知识 SQLite介绍 SQLi ... -
Android4开发入门经典 之 第七部分(2):数据存储
2012-07-08 08:45 1356数据存储基本知识 ... -
Android4开发入门经典 之 第七部分(1):数据存储
2012-07-08 08:44 1074数据存储基本知识 ... -
Android4开发入门经典 之 第六部分:Broadcast
2012-07-06 20:42 1028Broadcast基本概念 Broadcast是什 ... -
Android4开发入门经典 之 第五部分:Service
2012-07-05 12:42 957Service基本概念 Service是什么 是 ... -
Android4开发入门经典 之 第四部分:用户界面
2012-07-04 07:56 2644基本概念 常用Widgets和布局 常用 ... -
Android4开发入门经典 之 第三部分:Activity
2012-07-03 14:04 1542Activity基本概念 Activity是什 ... -
Android4开发入门经典 之 第二部分:Android应用的核心基础
2012-07-02 07:35 1878Android应用中的组件 Applicati ... -
跟我学Android4 之 第一部分:Android入门基础
2012-06-30 08:09 3207Android是什么 Android是一个针对移动 ...
相关推荐
《Android4开发入门经典》是一本专为初学者设计的指南,旨在帮助读者掌握Android 4(也称为Ice Cream Sandwich)平台的应用程序开发。这本书通过详细的笔记和分章节的PDF文档,逐步介绍了Android开发的基本概念和...
在Android开发中,Content Provider是一个至关重要的组件,它充当了应用程序间数据共享的桥梁。本文将深入探讨Content Provider的基本概念、创建方法、如何进行CRUD(Create、Read、Update、Delete)操作,以及如何...
在Android开发中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地访问和操作数据。这篇博文的示例程序"android content provider示例程序(简单记账)"旨在帮助开发者理解...
在Android系统中,Content Provider是四大组件之一,它是应用程序间数据共享的核心机制。Content Provider允许一个应用暴露其数据,使得其他应用可以读取或者写入这些数据,甚至跨应用程序进行数据交换。这篇博客...
在Android开发中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地访问和操作数据。本"Android Content Provider Demo"着重于演示如何创建和使用Content Provider来实现跨...
3. **Android组件**:Android应用由各种组件构成,如活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供者(Content Provider)。了解它们的功能和用法是入门的关键。 4. **布局与...
### Android系统开发入门知识点 #### 一、Android操作系统概述 **Android** 是一款由Google公司开发的基于Linux平台的开放源代码操作系统,主要用于各种移动设备。Android系统包含了操作系统、中间件以及应用程序...
在Android开发中,Content Provider是四大组件之一,它充当了数据共享和交换的桥梁,使得不同的应用程序之间可以安全地共享数据。本示例将详细解析如何自定义Content Provider,以便在Android应用间实现数据共享。 ...
《Android开发入门经典》 Android开发是当今移动应用开发领域的重要组成部分,对于想要涉足这个领域的初学者来说,了解并掌握Android开发的基本知识是至关重要的。本文将深入探讨Android开发环境的搭建、首个项目的...
Content Provider作为Android四大组件之一,允许应用程序将其数据公开给其他应用,同时也可访问其他应用的数据,实现了跨应用的数据共享。 ### 一、Content Provider基础 1. **定义与作用**:Content Provider是...
在Android系统中,Content Provider是四大组件之一,它扮演着数据共享和交换的重要角色。Content Provider使得应用程序可以将自己的数据暴露给其他应用,同时也能够访问其他应用公开的数据。在这个"android provider...
虽然标签部分似乎有些混乱,将本书标记为"C++经典书籍",但根据标题和描述,我们可以确定这实际上是一本关于Android开发的专业书籍。下面,我们将深入探讨与该书相关的几个关键知识点。 ### 一、Android开发基础 #...
以上只是《Android应用开发入门经典教程》中部分内容的概述,实际教程会更深入地探讨每个主题,通过实例和练习帮助读者巩固知识,真正掌握Android应用开发。如果你对Android开发感兴趣,这无疑是一份值得深入学习的...
本文将详细解析2011年9月7日关于Android跨进程通信之Content Provider的知识点,结合相关源码和实用工具进行阐述。 Content Provider是Android四大组件之一,它扮演着数据管理者的角色,允许不同的应用程序之间共享...
4. **UI控件**:Android提供了丰富的UI元素,如TextView、EditText、Button等,这些元素的使用方法和事件处理机制是初学者必须掌握的。 5. **数据存储**:教程会涵盖SharedPreferences、SQLite数据库和文件存储等...
理解Content Uri的概念和作用,掌握通过Content Provider访问联系人的方法,掌握通过Content Provider访问通话记录的方法,掌握通过Content Provider访问短信的方法。
- **Content Provider**: 提供数据共享的部分。 - **应用程序的生命周期** 指的是从创建到销毁的过程中,应用程序经历的不同状态。 ##### 5.2 应用程序包含的各个文件 - **主要文件** 包括: - **源代码文件** (`...
Content Provider作为Android四大组件之一,为其他应用提供了访问私有数据的标准化接口。通过Content Provider,一个应用可以将自己的数据暴露出去,让其他应用进行读取或者写入操作,实现了不同应用间的数据共享。 ...
一行代码完成Android 7 FileProvider适配Demo 通过FileProvider7这个类完成uri的获取即可,例如: FileProvider7.getUriForFile FileProvider7.setIntentDataAndType FileProvider7.setIntentData
"Android开发入门之路(初学者必读).zip"这个压缩包可能包含了一系列针对这些问题的教程、指南或者案例,帮助初学者系统地学习和掌握Android开发的基础知识。 首先,我们来看一下压缩包中的四个文件名,虽然没有...