http://blog.csdn.net/heqiangflytosky/article/details/31777363一文详细介绍了Android ContentProvider、ContentResolver和ContentObserver的用法,现在来做一个ContentProvider完整Demo。
直接上代码:

fragment_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.johnny.testcontacts.MainActivity$PlaceholderFragment" ><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="查询所有联系人"android:onClick="queryContact"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="插入单个联系人"android:onClick="insertContact"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="插入多个联系人"android:onClick="insertContacts"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="删除CBA"android:onClick="deleteContactsCBA"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="删除NBA"android:onClick="deleteContactsNBA"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="删除NBA易建联"android:onClick="deleteContactsNBAYI"/></LinearLayout></RelativeLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.johnny.testcontacts"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="14" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="com.johnny.testcontacts.MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><provider android:name="com.johnny.testcontacts.ContactsContentProvider"android:authorities="com.example.johnny.contentprovider"android:exported="false"android:enabled="true" ></provider></application></manifest>

ContactsBean.java

package com.johnny.testcontacts;public class ContactsBean {private String name;private String telephone;private long createDate;private String content;private String groupName;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getTelephone() {return telephone;}public void setTelephone(String telephone) {this.telephone = telephone;}public long getCreateDate() {return createDate;}public void setCreateDate(long createDate) {this.createDate = createDate;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String getGroupName() {return groupName;}public void setGroupName(String groupName) {this.groupName = groupName;}
}

ContactsContentProvider.java

package com.johnny.testcontacts;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.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.util.Log;public class ContactsContentProvider extends ContentProvider {//必须和AndroidManifest.xml中的android:authorities保持一致public static final String AUTHORITY = "com.example.johnny.contentprovider";public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);public static final String PARAM_GROUP_BY = "groupBy";public static final String PARAM_LIMIT = "limit";private SQLiteOpenHelper mOpenHelper;public static interface ContactsUri{static final String CONTACTS = "contacts";public static final Uri URI_CONTACTS = Uri.withAppendedPath(AUTHORITY_URI, CONTACTS);}static interface ContactsMatch {public static final int CONTACTS = 0x0001;}static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);static {final UriMatcher matcher = URI_MATCHER;matcher.addURI(AUTHORITY, ContactsUri.CONTACTS, ContactsMatch.CONTACTS);}@Overridepublic boolean onCreate() {mOpenHelper = DBOpenHelper.newInstance(getContext());return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder) {SQLiteDatabase db = mOpenHelper.getReadableDatabase();final int match = URI_MATCHER.match(uri);SQLiteQueryBuilder qb = new SQLiteQueryBuilder();String limit = uri.getQueryParameter(PARAM_LIMIT);String groupBy = uri.getQueryParameter(PARAM_GROUP_BY);switch (match) {case ContactsMatch.CONTACTS:qb.setTables(DBOpenHelper.ContactsTAB.TABLE_NAME);break;default:throw new UnsupportedOperationException("Unknown URL "+ uri.toString());}Cursor cursor = qb.query(db, projection, selection, selectionArgs,groupBy, null, sortOrder, limit);return cursor;}@Overridepublic String getType(Uri uri) {return null;}@Overridepublic Uri insert(Uri uri, ContentValues contentValues) {int match = URI_MATCHER.match(uri);final SQLiteDatabase db = mOpenHelper.getWritableDatabase();long id = -1;switch (match) {case ContactsMatch.CONTACTS:id = db.insert(DBOpenHelper.ContactsTAB.TABLE_NAME, null, contentValues);break;default:throw new UnsupportedOperationException("Unknown insert URI " + uri);}if (id >= 0) {getContext().getContentResolver().notifyChange(uri,null);return ContentUris.withAppendedId(uri, id);} else {return null;}}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {final int match = URI_MATCHER.match(uri);final SQLiteDatabase db = mOpenHelper.getWritableDatabase();int deleted = 0;switch (match) {case ContactsMatch.CONTACTS:deleted = db.delete(DBOpenHelper.ContactsTAB.TABLE_NAME, selection, selectionArgs);break;default:throw new UnsupportedOperationException("Unknown delete URI " + uri);}if (deleted > 0) {getContext().getContentResolver().notifyChange(uri,null);}return deleted;}@Overridepublic int update(Uri uri, ContentValues contentValues, String selection, String[] selectionArgs) {int match = URI_MATCHER.match(uri);final SQLiteDatabase db = mOpenHelper.getWritableDatabase();int modified = 0;switch (match) {case ContactsMatch.CONTACTS:modified = db.update(DBOpenHelper.ContactsTAB.TABLE_NAME, contentValues, selection, selectionArgs);break;default:throw new UnsupportedOperationException("Unknown update URI " + uri);}if (modified > 0) {getContext().getContentResolver().notifyChange(uri,null);}return modified;}
}

DBOpenHelper.java

package com.johnny.testcontacts;import android.content.ContentProviderOperation;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.util.Log;import java.util.ArrayList;/*** Created by heqiang on 15-1-16.*/
public class DBOpenHelper extends SQLiteOpenHelper{private final static String TAG = "ContactsTAB";private static final String DB_NAME = "testcontacts.db";private static final int DB_VERSION = 1;public final Object CONTACTS_TABLE_LOCK = new Object();private static Context mContext;private static DBOpenHelper sInstance;private DBOpenHelper(Context context){super(context, DB_NAME, null, DB_VERSION);}public static synchronized DBOpenHelper newInstance(Context context) {if (sInstance == null) {sInstance = new DBOpenHelper(context);mContext = context;}return sInstance;}public static synchronized DBOpenHelper getInstance() {return sInstance;}public static final class ContactsTAB{public static final String TABLE_NAME = "contacts";public static final String _ID = "_id";public static final String CONTACT_NAME = "name";public static final String CONTACT_TELEPHONE = "telephone";public static final String CONTACT_CREATE_DATE = "create_date";public static final String CONTACT_CONTENT = "content";public static final String CONTACT_GROUP = "group_name";public static ContentValues parseContentValuse(ContactsBean bean){ContentValues contentValues = new ContentValues();contentValues.put(ContactsTAB.CONTACT_NAME,bean.getName());contentValues.put(ContactsTAB.CONTACT_TELEPHONE,bean.getTelephone());contentValues.put(ContactsTAB.CONTACT_CREATE_DATE,bean.getCreateDate());contentValues.put(ContactsTAB.CONTACT_CONTENT,bean.getContent());contentValues.put(ContactsTAB.CONTACT_GROUP,bean.getGroupName());return contentValues;}}static interface SQLS {public static final String SQL_CREATE_CONTACTS_TABLE = "CREATE TABLE " + ContactsTAB.TABLE_NAME + " ("+ ContactsTAB._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"+ ContactsTAB.CONTACT_NAME + " TEXT,"+ ContactsTAB.CONTACT_TELEPHONE + " TEXT,"+ ContactsTAB.CONTACT_GROUP +" TEXT,"+ ContactsTAB.CONTACT_CONTENT +" TEXT,"+ ContactsTAB.CONTACT_CREATE_DATE + " INTEGER"+ ");" ;}@Overridepublic void onCreate(SQLiteDatabase db) {createTables(db);}@Overridepublic void onUpgrade(SQLiteDatabase db, int i, int i2) {}private void createTables(SQLiteDatabase db) {db.execSQL(SQLS.SQL_CREATE_CONTACTS_TABLE);}private void doApplyOperations(Uri uri, ArrayList<ContentProviderOperation> ops) {try {mContext.getContentResolver().applyBatch(uri.getAuthority(), ops);} catch (Exception e) {Log.d(TAG, "doApplyOperations error!", e);}}public void insertContact(ContactsBean bean){ContentValues contentValues = ContactsTAB.parseContentValuse(bean);mContext.getContentResolver().insert(ContactsContentProvider.ContactsUri.URI_CONTACTS, contentValues);}public void insertContacts(ArrayList<ContactsBean> beans){Uri uri = ContactsContentProvider.ContactsUri.URI_CONTACTS;ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();for(ContactsBean bean : beans){ContentValues contentValues = ContactsTAB.parseContentValuse(bean);ContentProviderOperation operation = ContentProviderOperation.newInsert(uri).withValues(contentValues).build();ops.add(operation);}synchronized (CONTACTS_TABLE_LOCK) {doApplyOperations(uri, ops);}}public void deleteContactsByContent(String group){mContext.getContentResolver().delete(ContactsContentProvider.ContactsUri.URI_CONTACTS, ContactsTAB.CONTACT_CONTENT + "=?", new String []{ group } );}public void deleteContactsByContentAndName(String group,String name){mContext.getContentResolver().delete(ContactsContentProvider.ContactsUri.URI_CONTACTS, ContactsTAB.CONTACT_CONTENT + "=? AND " + ContactsTAB.CONTACT_NAME + "=?", new String []{ group, name} );}public ArrayList<ContactsBean> queryAllContacts(){ArrayList<ContactsBean> beans = new ArrayList<ContactsBean>();Cursor c = null;c = mContext.getContentResolver().query(ContactsContentProvider.ContactsUri.URI_CONTACTS,null,null,null,null);if (c != null && c.moveToFirst()) {do {ContactsBean bean = new ContactsBean();bean.setName(c.getString(c.getColumnIndex(ContactsTAB.CONTACT_NAME)));bean.setContent(c.getString(c.getColumnIndex(ContactsTAB.CONTACT_CONTENT)));bean.setCreateDate(c.getLong(c.getColumnIndex(ContactsTAB.CONTACT_CREATE_DATE)));bean.setGroupName(c.getString(c.getColumnIndex(ContactsTAB.CONTACT_GROUP)));bean.setTelephone(c.getString(c.getColumnIndex(ContactsTAB.CONTACT_TELEPHONE)));beans.add(bean);}while(c.moveToNext());c.close();}return beans;}
}

MainActivity.java

package com.johnny.testcontacts;import java.util.ArrayList;import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.database.ContentObserver;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;public class MainActivity extends ActionBarActivity {private DBOpenHelper mDBOpenHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if (savedInstanceState == null) {getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);mDBOpenHelper = DBOpenHelper.getInstance();getContentResolver().registerContentObserver(ContactsContentProvider.ContactsUri.URI_CONTACTS, true, mContentObserver);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}/*** A placeholder fragment containing a simple view.*/public static class PlaceholderFragment extends Fragment {public PlaceholderFragment() {}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View rootView = inflater.inflate(R.layout.fragment_main, container,false);return rootView;}}public void queryContact(View view){new Thread(new Runnable() {@Overridepublic void run() {ArrayList<ContactsBean> beans = mDBOpenHelper.queryAllContacts();for(ContactsBean bean : beans){Log.e("Test","----------------------");Log.e("Test","name = "+bean.getName());Log.e("Test","content = "+bean.getContent());Log.e("Test","groupName = "+bean.getGroupName());Log.e("Test","telephone = "+bean.getTelephone());Log.e("Test","createDate = "+bean.getCreateDate());Log.e("Test","----------------------");}}}).start();}public void insertContact(View view){new Thread(new Runnable() {@Overridepublic void run() {ContactsBean bean = new ContactsBean();bean.setName("James");bean.setGroupName("East");bean.setTelephone("13700000000");bean.setCreateDate(System.currentTimeMillis());bean.setContent("NBA");mDBOpenHelper.insertContact(bean);}}).start();}public void insertContacts(View view){new Thread(new Runnable() {@Overridepublic void run() {ArrayList<ContactsBean> beans = new ArrayList<ContactsBean>();ContactsBean bean = new ContactsBean();bean.setName("Park");bean.setGroupName("West");bean.setTelephone("13711111111");bean.setCreateDate(System.currentTimeMillis());bean.setContent("NBA");beans.add(bean);bean = new ContactsBean();bean.setName("YiJianLian");bean.setGroupName("South");bean.setTelephone("135000000");bean.setCreateDate(System.currentTimeMillis());bean.setContent("CBA");beans.add(bean);bean = new ContactsBean();bean.setName("YiJianLian");bean.setGroupName("East");bean.setTelephone("13599999999");bean.setCreateDate(System.currentTimeMillis());bean.setContent("NBA");beans.add(bean);mDBOpenHelper.insertContacts(beans);}}).start();}public void deleteContactsCBA(View view){new Thread(new Runnable() {@Overridepublic void run() {mDBOpenHelper.deleteContactsByContent("CBA");}}).start();}public void deleteContactsNBA(View view){new Thread(new Runnable() {@Overridepublic void run() {mDBOpenHelper.deleteContactsByContent("NBA");}}).start();}public void deleteContactsNBAYI(View view){new Thread(new Runnable() {@Overridepublic void run() {mDBOpenHelper.deleteContactsByContentAndName("NBA", "YiJianLian");}}).start();}private ContentObserver mContentObserver = new ContentObserver(new Handler()) {@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);new Thread(new Runnable() {@Overridepublic void run() {ArrayList<ContactsBean> beans = mDBOpenHelper.queryAllContacts();for(ContactsBean bean : beans){Log.e("Test","----------------------");Log.e("Test","name = "+bean.getName());Log.e("Test","content = "+bean.getContent());Log.e("Test","groupName = "+bean.getGroupName());Log.e("Test","telephone = "+bean.getTelephone());Log.e("Test","createDate = "+bean.getCreateDate());Log.e("Test","----------------------");}}}).start();}};}

ContentProvider使用Demo相关推荐

  1. 系出名门Android(9) - 数据库支持(SQLite), 内容提供器(ContentProvider)

    [索引页] [×××] 系出名门Android(9) - 数据库支持(SQLite), 内容提供器(ContentProvider) 作者:webabcd 介绍 在 Android 中使用 SQLit ...

  2. ContentProvider基本使用初探

    ContentProvider是Android中提供的专门用于进程间通信,它底层也是Binder,系统已经为我们做了封装.系统预置了很多ContentProvider,比如通讯录,日程表信息等应用.访 ...

  3. ContentProvider总结与简单Demo

    一.ContentProvider简介         当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数 ...

  4. Android ContentProvider 完全解析及简单DEMO

    Android应用程序运行在不同的进程空间中,因此不同应用程序的数据是不能够直接访问的.为了增强程序之间的数据共享能力,Android系统提供了像SharedPreferences这类简单的跨越程序边 ...

  5. Android ContentProvider实现两个程序间数据共享demo,跨进程通讯

    1.客户端代码: 先实现服务端 SQL创建: public class DBHelper extends SQLiteOpenHelper {// 数据库名private static final S ...

  6. Android ContentProvider、ContentResolver和ContentObserver的使用

    1.ContentProvider.ContentResolver和ContentObserver ContentProvider是Android的四大组件之中的一个,可见它在Android中的作用非 ...

  7. provider android简书,Android 使用ContentProvider在应用间共享数据

    Android 使用ContentProvider在应用间共享数据 题图 www.gratisography.com 在开发的过程中,有时会有需求要实现应用程序之间实现数据共享,在Android系统中 ...

  8. Android之通过ContentProvider实现两个app(进程间)间通信以及函数调用

    1.ContentProvider简单介绍 ContentProvider以在不同的应用程序之间共享数据,ContentProvider底层实现是Binder,它为存储和获取数据提供统一的接口 2.实 ...

  9. android 获取phone实例,Android ContentProvider获取手机联系人实例

    在做项目的时候,因为要用到我们自动获取联系人的姓名和电话,就想到了ContentProvider分享数据的功能,这样做既节省了时间,也减少了我们输入错误号码的几率,所以,想在这里把小demo分享给大家 ...

最新文章

  1. lightoj 1014
  2. 争议中挺进全新里程——中国“超级对撞机”《概念设计报告》发布侧记
  3. 第十一次个人例行报告
  4. 判断一个数是否是回文数
  5. C++ Primer 5th笔记(chap 14 重载运算和类型转换)输入和输出运算符
  6. Android有返回值的Activity
  7. 后台getshell常用技巧总结
  8. 写给大数据开发初学者的话4
  9. linux dns 问题吗,Linux下DNS的问题
  10. 【BZOJ1924】【SDOI2010】所驼门王的宝藏(Tarjan,SPFA)
  11. window.open被浏览器拦截的解决方案
  12. 10-20-030-简介-Kafka Briker IO
  13. initwithcoder和 initwithframe 区别?
  14. 39行代码实现JS HTML模板(轻量+高效+易用)
  15. CDA level 1 业务分析师 推荐学习书目
  16. 控制台调出Servers
  17. 微信多开服务器,PC端微信多开
  18. FPGA芯片的GTX/GTH/GTY/GTP/GTZ/GTM高速信号有什么区别?
  19. P4318-莫比乌斯函数+容斥
  20. N行M列每个位置放Aij个1厘米的正方体,求表面积

热门文章

  1. 多功能运算求解器_matlab中bsxfun函数
  2. 解决utf-8‘ codec can‘t decode byte 0xca in position 0: invalid continuation byte
  3. 关于小程序widthFix图片高度不能自适应的问题
  4. SCA连载GDPR罚单之保加利亚国家税务局(NRA)信息泄露事件
  5. Visual Studio 中使用万能头文件 #include <bits/stdc++.h>
  6. linux内核ppt刘小明,【陈老师华为北研所讲座PPT】从机制与策略探究Linux内核设计之道(4)...
  7. selenium打开firefox无痕模式
  8. dump和coredump
  9. 电路中滤波电容和退耦电容_去耦电路中,耦合电容容量越大越好吗?
  10. QPixmap的setMask方法