- 浏览: 3480821 次
- 性别:
- 来自: China
-
文章分类
- 全部博客 (536)
- ajax (1)
- Algorithm (14)
- Android (40)
- CSS/HTML... (2)
- defy (3)
- DesignPattern (2)
- dorado (0)
- Drools (6)
- English/日本語 (7)
- Flex (2)
- Framework (0)
- Google (3)
- hibernate (13)
- homework (3)
- HTML5 (0)
- IDE (29)
- java (45)
- javaee (7)
- Javascript (14)
- java组件 (5)
- jQuery (4)
- jsp (8)
- jsf (2)
- Linux (2)
- lucene (0)
- mysql (6)
- news (3)
- Oracle (8)
- other (4)
- PHP (5)
- Python (0)
- Software Engineering (3)
- spring (7)
- struts1.x (14)
- struts2.x (14)
- strolling in cloud (1)
- subject:javaEnhance (20)
- Tomcat (7)
- validator (3)
- 学习·方法·心得 (8)
- .NET (2)
- vba (6)
- groovy (5)
- grails (2)
- SWT (0)
- big data (1)
- perl (1)
- objective-c (50)
- product (1)
- mac (7)
- ios (188)
- ios-phone (2)
- ios-system (15)
- ios-network (5)
- ios-file (4)
- ios-db (1)
- ios-media (3)
- ios-ui (27)
- ios-openSource (6)
- ios-animation (5)
- ios-drawing (7)
- c (2)
- ios-app (2)
- ios-course (15)
- ios-runtime (14)
- ios-code (8)
- ios-thread (8)
- ios-LBS (2)
- ios-issue (1)
- ios-design (2)
- Jailbreak (2)
- cocos2d (0)
- swift (16)
- ios-framework (4)
- apple watch (4)
- ios-web (1)
- react native (3)
- TVOS (1)
- OpenGL (1)
最新评论
-
xiaobinggg:
...
Session机制详解 -
菜鸟学生会:
Drools规则工作流引擎开发教程网盘地址:http://pa ...
Drools入门-----------环境搭建,分析Helloworld -
wangyudong:
不是很好用,不支持自动化测试RESTful API,也不支持自 ...
Simple REST Client POST使用方法 -
Paul0523:
很棒的一篇文章,感谢楼主分享
Session机制详解 -
啸笑天:
获取原型对象的三种方法<script>functi ...
复习JavaScript面向对象技术
使用ContentProvider共享数据
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。
当应用需要通过ContentProvider对外共享数据时,第一步需要继承ContentProvider并重写下面方法:
public class PersonContentProvider extends ContentProvider{
public boolean onCreate()
public Uri insert(Uri uri, ContentValues values)
public int delete(Uri uri, String selection, String[] selectionArgs)
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
public String getType(Uri uri)}
第二步需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider , ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,你可以把 ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities 就是他的域名:
<manifest .... >
<application android:icon="@drawable/icon" android:label="@string/app_name">
<provider android:name=".PersonContentProvider" android:authorities="com.jbridge.provider.personprovider"/>
</application>
</manifest>
注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider(内容提供者)。
Uri介绍
Uri代表了要操作的数据,Uri主要包含了两部分信息:1》需要操作的ContentProvider ,2》对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:

ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
ContentProvider示例程序
我们为《Android之SQlite存储》示例程序添加一个ContentProvider,供其他应用来访问我们的数据。
1.为SQLite示例程序添加ContentProvider类
package com.jbridge.db; import com.jbridge.service.DataBaseOpenHelper; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.text.TextUtils; public class PersonContentProvider extends ContentProvider { private DataBaseOpenHelper dbOpenHelper; private static final int ALLPERSON = 1; private static final int PERSON = 2; private static final UriMatcher sMatcher = new UriMatcher( UriMatcher.NO_MATCH); static { sMatcher.addURI("com.jbridge.provider.personprovider", "person", ALLPERSON); sMatcher.addURI("com.jbridge.provider.personprovider", "person/#", PERSON); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); int count = 0; switch (sMatcher.match(uri)) { case ALLPERSON:// com.jbridge.provider.personprovider/person count=db.delete("person", selection,selectionArgs); break; case PERSON:// com.jbridge.provider.personprovider/person/10 long personid=ContentUris.parseId(uri); //防止他输入时String selection, String[] selectionArgs参数为空,这样就会修改表的所有数据了 String where=TextUtils.isEmpty(selection)?"personid=?":selection+" and personid=?"; String[] params=new String[]{String.valueOf(personid)}; if (!TextUtils.isEmpty(selection)&&selectionArgs!=null) { params=new String[selectionArgs.length+1]; for (int i=0;i<selectionArgs.length;i++) { params[i]=selectionArgs[i]; } params[selectionArgs.length]=String.valueOf(personid); } count = db.delete("person", where,params); break; default: throw new IllegalArgumentException("Unknow Uri:" + uri); } return count; } @Override public String getType(Uri uri) { switch (sMatcher.match(uri)) { case ALLPERSON:// //数据集的MIME类型字符串则应该以vnd.android.cursor.dir/开头 return "vnd.android.cursor.dir/personprovider.person"; case PERSON://单一数据的MIME类型字符串应该以vnd.android.cursor.item/开头 return "vnd.android.cursor.item/personprovider.person"; default: throw new IllegalArgumentException("Unknow Uri:" + uri); } } @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); long id = 0; switch (sMatcher.match(uri)) { case ALLPERSON:// com.jbridge.provider.personprovider/person id = db.insert("person", "name", values);// 返回值是记录的行号,主键为int实际上就是主键值,主键为text则为行号 return ContentUris.withAppendedId(uri, id); case PERSON:// com.jbridge.provider.personprovider/person/10 id = db.insert("person", "name", values);// 返回值是记录的行号,主键为int实际上就是主键值,主键为text则为行号 String path = uri.toString(); return Uri.parse(path.substring(0, path.lastIndexOf("/")) + id); default: throw new IllegalArgumentException("Unknow Uri:" + uri); } } @Override public boolean onCreate() { dbOpenHelper=new DataBaseOpenHelper(this.getContext()); return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); switch (sMatcher.match(uri)) { case ALLPERSON:// com.jbridge.provider.personprovider/person return db.query("person",projection, selection, selectionArgs,null, null, sortOrder); case PERSON:// com.jbridge.provider.personprovider/person/10 long personid=ContentUris.parseId(uri); //防止他输入时String selection, String[] selectionArgs参数为空,这样就会修改表的所有数据了 String where=TextUtils.isEmpty(selection)?"personid=?":selection+" and personid=?"; String[] params=new String[]{String.valueOf(personid)}; if (!TextUtils.isEmpty(selection)&&selectionArgs!=null) { params=new String[selectionArgs.length+1]; for (int i=0;i<selectionArgs.length;i++) { params[i]=selectionArgs[i]; } params[selectionArgs.length]=String.valueOf(personid); } return db.query("person",projection, where, params,null, null, sortOrder); default: throw new IllegalArgumentException("Unknow Uri:" + uri); } } @Override //返回值为影响的记录数 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); int count = 0; switch (sMatcher.match(uri)) { case ALLPERSON:// com.jbridge.provider.personprovider/person count = db.update("person", values, selection,selectionArgs); break; case PERSON:// com.jbridge.provider.personprovider/person/10 long personid=ContentUris.parseId(uri); //防止他输入时String selection, String[] selectionArgs参数为空,这样就会修改表的所有数据了 String where=TextUtils.isEmpty(selection)?"personid=?":selection+" and personid=?"; String[] params=new String[]{String.valueOf(personid)}; if (!TextUtils.isEmpty(selection)&&selectionArgs!=null) { params=new String[selectionArgs.length+1]; for (int i=0;i<selectionArgs.length;i++) { params[i]=selectionArgs[i]; } params[selectionArgs.length]=String.valueOf(personid); } count = db.update("person", values, where,params); break; default: throw new IllegalArgumentException("Unknow Uri:" + uri); } return count; } }
2.添加ContentProvider配置
<provider android:name=".PersonContentProvider" android:authorities="com.jbridge.provider.personprovider" android:permission="android.permission.READ_PERSON_DB"/> |
3.测试SQLite示例程序的ContentProvider,建立项目contentProviderUser
Project name: contentProviderUser
BuildTarget:Android2.2
Application name: 内容使用者
Package name: com.jbridge.user
Create Activity: ContentProviderUserActivity
Min SDK Version:8
package com.jbridge.user; import android.R.string; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.util.Log; public class ContentProviderUserActivity extends Activity { private static final String TAG="ContentProviderUserActivity"; /* @Override //向数据库插入数据 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ContentResolver contentResolver=this.getContentResolver(); Uri uri=Uri.parse("content://com.jbridge.provider.personprovider/person"); ContentValues values=new ContentValues(); values.put("name", "刘德华"); values.put("age",(short)55); contentResolver.insert(uri, values); }*/ /* @Override //向数据库修改数据 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ContentResolver contentResolver=this.getContentResolver(); Uri uri=Uri.parse("content://com.jbridge.provider.personprovider/person/4"); ContentValues values=new ContentValues(); values.put("name", "haha"); values.put("age",(short)55); contentResolver.update(uri, values, null, null); }*/ /*@Override //向数据库删除数据 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ContentResolver contentResolver=this.getContentResolver(); Uri uri=Uri.parse("content://com.jbridge.provider.personprovider/person"); contentResolver.delete(uri, "personid>?",new String[]{String.valueOf(18)} ); // contentResolver.delete(uri,null,null ); }*/ /*@Override //向数据库查询数据 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ContentResolver contentResolver=this.getContentResolver(); Uri uri=Uri.parse("content://com.jbridge.provider.personprovider/person"); Cursor cursor=contentResolver.query(uri, new String[]{"personid","name","age"}, null, null, "personid desc"); while (cursor.moveToNext()) { Log.i(TAG, "personid "+cursor.getInt(0)); } cursor.close(); }*/ @Override //向电话本取得数据 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ContentResolver contentResolver=this.getContentResolver(); Cursor cursor=contentResolver.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); while (cursor.moveToNext()) { int contactID=cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID)); String name=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); Log.i(TAG, "contactid="+contactID+",name="+name); Cursor phones=contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactID,null, null); StringBuilder sb=new StringBuilder(); while (phones.moveToNext()) { String phoneNumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); sb.append(phoneNumber).append(","); } sb.deleteCharAt(sb.lastIndexOf(",")); phones.close(); Log.i(TAG, sb.toString()); Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactID, null, null); while (emails.moveToNext()) { // This would allow you get several email addresses String emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); Log.i(TAG, "emailAddress="+ emailAddress); } emails.close(); cursor.close(); } } }
<uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.READ_PERSON_DB"/>
发表评论
-
Android 桌面部件
2011-07-06 19:26 1897桌面部件是一种利用AppWidget框架将应用程序的某个部件放 ... -
Android 实时文件夹
2011-07-06 15:38 2887实时文件夹是一种用来显示由某个ContentProvider提 ... -
android 添加桌面快捷方式
2011-07-05 19:20 13349、在桌面创建快捷方式方法: 方法一:通过长按某一个应用程序的 ... -
Android权限详解
2011-07-04 09:43 2264在Android的设计中,资源的访问或者网络连接,要得到这 ... -
Android权限注解
2011-07-04 09:33 3517Android应用程序在使用很多功能的时候必须在Mainife ... -
ListView使用SimpleAdapter加载网络图片
2011-07-02 19:14 7739ListView是一种常见的布局,通过SimpleAdapte ... -
android:layout_gravity 和 android:gravity 的区别
2011-07-02 19:00 2128gravity 这个英文单词是重心的意思,在这里就表示 ... -
横竖屏切换时不销毁当前activity 和 锁定屏幕
2011-07-02 18:58 3655首先在Mainifest.xml的Activity元素 ... -
onSaveInstanceState和onRestoreInstanceState触发的时机
2011-07-02 17:49 2898当某个activity变得“容易”被系统销毁时,该ac ... -
strings.xml文件中提供占位符来格式化数据
2011-07-01 16:16 3270有些朋友可能会动态的修改Android中strings. ... -
ANDROID开机动画分析
2011-05-25 15:40 5944Android 2.0 开机动画文件分析。开机动画文件:boo ... -
Android专栏地址,真的不错啊!!!
2011-05-22 20:22 1679第三极: http://disanji.net/cate ... -
A1200入门DIY
2011-05-22 11:40 0A1200入门DIY 2007-04-16 19:33 ... -
android用户界面数据绑定
2011-05-19 21:25 5304当我们想用合适的方式显示并操作一些数据(如数组,链表,数据库等 ... -
emulator: ERROR: the user data image is used by another emulator. aborting
2011-05-19 13:48 2377今天早上起床,运行项目时报错:Error the use ... -
Android Map demo
2011-04-23 22:24 3422AndroidManifest.xml <?xm ... -
Android Map申请key
2011-04-23 22:02 31551. 首先先要获取你的debug keystore位置 ... -
conversion to dalvik format failed with error 1
2011-04-23 21:52 3490android低版本工程(如1.5)放到高版本环境中(如2.2 ... -
Android GPS基础
2011-04-20 22:14 2809package org.example.locationtes ... -
Android API:Activity.managedQuery()
2011-04-20 19:22 2648描述: 获取一个包含指定数据的 Cursor 对 ...
相关推荐
内容提供者(Content Provider)是Android系统中的一种机制,允许应用程序将自己的数据暴露给其他应用。它是一个实现了标准接口的组件,用于存储和检索数据,使得不同应用之间可以安全地共享数据,即使这些数据存储...
在Android操作系统中,内容提供者(Content Provider)是四大组件之一,它扮演着数据共享的关键角色。内容提供者允许应用程序之间共享和访问数据,即使这些数据存储在私有数据库、文件系统或者网络中。这对于开发者...
在Android系统中,内容提供者(Content Provider)是四大组件之一,它负责管理应用程序间的数据共享。内容提供者使得一个应用的数据可以被其他应用访问,实现了数据的跨应用通信。以下将详细介绍Android内容提供者的...
在Android开发中,内容提供者(Content Provider)和内容观察者(Content Observer)是两个非常重要的组件,它们在数据共享和实时数据更新方面扮演着关键角色。本篇将深入探讨这两个概念及其在“手机卫士”这样的...
在Android系统中,内容提供者(Content Provider)是Android应用程序之间数据共享的一种机制,它使得一个应用的数据可以被其他应用访问。在这个实例中,我们将深入探讨如何使用Android通讯录的内容提供者来查询和...
在Android开发中,内容提供者(Content Provider)是Android系统中的四大组件之一,它负责管理应用程序间的数据共享。内容提供者让应用的数据可以被其他应用访问,实现了数据的跨应用共享。在这里,我们将深入探讨...
在Android系统中,内容提供者(Content Provider)是应用程序间数据共享的重要机制。它允许一个应用将自己的数据结构公开,让其他应用可以访问和操作这些数据,就像操作SQLite数据库一样。这篇博客“android之内容...
Content Provider的这种设计不仅提高了数据访问的安全性,还提供了灵活的数据共享方式,是Android系统中数据交互的重要组成部分。 总结来说,Content Provider的共享数据更新通知机制是通过ContentService、...
在Android开发中,`android.provider`包是系统提供的一个核心包,主要用于与系统的各种内容提供者(Content Provider)进行交互。这些内容提供者是Android系统数据共享的关键组件,它们允许应用访问并操作如联系人、...
在Android系统中,内容提供者(Content Provider)是Android四大组件之一,它是应用程序间数据共享的主要机制。通过内容提供者,一个应用可以将自己的数据暴露给其他应用,同时也能够访问其他应用公开的数据。在这个...
- Intent:Content Provider可以作为Intent的目标,例如启动一个Activity来编辑提供者中的数据。 - Broadcast Receiver:可以监听Content Provider的变更,例如数据插入、更新或删除时触发广播。 7. **Content ...
本章节主要介绍了Android中的内容提供者(Content Provider)和意图(Intent)。内容提供者是一个允许不同应用程序之间共享数据的机制,而意图则是Android系统中的一种 Nachrichten mechanism,可以激活其他应用程序...
在实际开发中,我们可以利用Android提供的`adb shell content`命令行工具来测试Content Provider的功能。通过这个工具,可以执行查询、插入、删除和更新等操作,直观地观察Content Provider的工作情况。 至于压缩包...
在Android开发中,内容提供者(Content Provider)是Android四大组件之一,它是应用程序间数据共享的重要机制。通过自定义内容提供者,开发者可以将自己的数据结构公开给其他应用,实现跨应用的数据交换。本主题将...
内容提供者是一个实现了特定接口的类,它封装了应用程序的数据并提供了标准的CRUD(创建、读取、更新、删除)操作。这使得其他应用能够通过Content Resolver进行数据交互,而无需直接访问底层数据库。 2. **URI的...
- **内容观察者**:允许其他应用程序监听 Content Provider 的变化,并采取相应的措施。 #### 七、总结 Content Provider 是 Android 平台上非常重要的一个组件,它不仅为数据共享提供了标准的 API,而且还为...
在Android系统中,内容提供者(Content Provider)是应用程序间数据共享的重要机制。它遵循了Android的四大组件(Activity、Service、Broadcast Receiver、Content Provider)之一的架构,使得不同的应用可以安全地...