1 ContentProvider内容提供者

四大组件之一,实现不同程序实现数据的共享。联系人应用就使用了ContentProvider,比如你在自己的应用可以读取和修改联系人的数据(获得相应权限)。
其实它也是一个中间人,真正的数据源是文件或者SQLite。通过Uri向外暴露访问地址 

2 ContentResolver内容解析者

一个应用通过ContentResolver可以访问另一个应用通过ContentProvider提供的数据(当然也可以在自己的应用中)。

3 ContentObserver内容观察者

监听数据库的变化,执行相应的操作。更新UI
mContentResolver.registerContentObserver(WicketProvider.CONTENT_URI, true, mChatObserver);
使用步骤
1 自定义UserContentProvider
   a 自定义数据库工具类
   b 自定义UserContentProvider继承ContentProvider 覆写对应的方法
      创建,增删改查方法
 public class UserContentProvider extends ContentProvider {

// 声明当前ContentProvider组件的唯一标识(Authority),注:必须使用小写字母
private static final StringAUTHORITY ="com.user.contentprovider.users";
     @Override
public boolean onCreate() {
return false;
} @Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return null;
} @Nullable
@Override
public String getType(Uri uri) {
return null;
} @Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
} @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
} @Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return 0;
}
}

c 清单文件中配置provider

<provider android:name="com.user.contentprovider.UserContentProvider"
android:authorities="com.user.contentprovider.users"
android:exported="true"/>

2 另一个应用中使用ContentResolver访问数据

 public class MainActivity extends Activity{
private TextView tv_info;
private ContentResolver resolver;
private Uri uri = Uri.parse("content://com.user.contentprovider.users/users");
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
tv_info = (TextView)findViewById(R.id.tv_info);
resolver = getContentResolver();
}
public void click(View v){
switch (v.getId()) {
case R.id.bt_query:
//建表时的语句:create table t_user(_id integer primary key,uname,upass,money)
query();//调用自定义的查询所有数据的方法
break;
case R.id.bt_insert:
insert();//调用自定义的插入数据的方法
break;
case R.id.bt_update:
//请自行实现
break;
default:
break;
}
}
private void insert() {
//调用自定义的插入数据的方法(硬编码)
ContentValues values = new ContentValues();
values.put("uname", "zhang");
values.put("upass", "321");
values.put("money", "99");
Uri nUri = resolver.insert(uri, values);//sqlite会自动指定主键id
long newId = ContentUris.parseId(nUri);//获取新插入的id
Toast.makeText(this, ""+newId, 0).show();
}
private void query() {
//自定义的查询所有数据的方法
Cursor c = resolver.query(uri , new String[]{"_id","uname","upass","money"}, null, null,null);
String text = "";
while(c.moveToNext()){
text +=c.getString(0)+","+c.getString(1)+","+c.getString(2)+","+c.getString(3)+"\n";
}
tv_info.setText(text);
}
}
【备注:】
ContentProvider是单例模式的,当多个应用程序通过使用ContentResolver 来操作使用ContentProvider 提供的数据时,ContentResolver 调用的数据操作会委托给同一个ContentProvider 来处理。这样就能保证数据的一致性。
Cursor 游标,查询时返回的结果集 
具体应用参考实际开发项目。
 
使用ContentProvider和ContentResolver时,是否可用第三方ORM数据库工具,如GreenDao操作数据库?
不建议使用。这两者是通过Uri来操作数据,而GreenDao是通过bean来操作数据库。
 
SQLiteDatabase 和 ContentResolver操作数据库api有所不同,前者操作对象为表,后者为Uri。
 

ContentProvider,ContentResolver和ContentObserver 使用的更多相关文章

  1. ContentProvider、ContentResolver、ContentObserver之间的关系

    ContentProvider.ContentResolver.ContentObserver之间的关系 ContentPRrovider: * 四大组件的内容提供者,主要用于对外提供数据 * 实现各 ...

  2. Android ContentProvider、ContentResolver和ContentObserver的使用

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

  3. ContentProvider 、 ContentResolver 、 ContentObserver

    说说ContentProvider . ContentResolver . ContentObserver 之间的关系**a. ContentProvider 内容提供者,用于对外提供数据 b. Co ...

  4. AndroidContentProvider ContentResolver和ContentObserver的使用

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

  5. ContentProvider ContentResolver ContentObserver 内容:提供、访问、监听

    内容提供 public class PersonContentProvider extends ContentProvider{ private static final String AUTHORI ...

  6. ContentProvider要点复习

    ContentProvider要点复习 ContentProvider作为四大组件之一,发挥着举足轻重的作用.与之相关联的另外两个类分别是ContentResolver和ContentObserver ...

  7. 安卓中的数据存储方式以及ContentProvider的简单介绍

    1.介绍android的数据存储方式 File存储 sharedPrefrence存储方式 conmtentprovider sqlitedatabase 网络存储   2.请介绍下ContentPr ...

  8. ContentProvider 使用详解

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  9. Android 这 13 道 ContentProvider 面试题,你都会了吗?

    前言 作为 Android 的四大组件之一,ContentProvider 可以说是无处不在了. 但是对于我而言,开发过程中看似 ContentProvider 用得很娴熟,却一直没能形成一个完整的体 ...

随机推荐

  1. python是强语言还是弱语言?

    python是强语言还是弱语言,没有一个具体官方的说法 数据类型也就是变量类型,一般编程语言的变量类型可以分成下面两类. 静态类型与动态类型 静态类型语言:一种在编译期间就确定数据类型的语言.大多数静 ...

  2. 通过编写串口助手工具学习MFC过程——(八)遇到的一些问题

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  3. angular 示例项目

    cnpm install 环境安装好后,快速创建一个新项目,如在D盘下新建一个angularProject项目,只要在本地目录下 ng new angularProject angularProjec ...

  4. Redis---键的过期时间及数据淘汰策略

    5.键的过期时间   Redis可以为每个键设置过期时间,当键过期时,会自动删除该键.   对于散列表这种容器,只能为整个键设置过期时间(整个散列表),而不能为键里面的单个元素设置过期时间. 6.数据 ...

  5. MyBatis源码浅析

    什么是MyBatis MyBatis是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集.MyBatis 使用简单的 ...

  6. Python核心技术与实战——十一|程序的模块化

    我们现在已经总结了Python的基本招式和套路,现在可以写一些不那么简单的系统性工程或代码量较大的应用程序.这时候,一个简单的.py文件就会显得过于臃肿,无法承担一个重量级软件开发的重任.这就需要这一 ...

  7. HDU 5446 Unknown Treasure(lucas + 中国剩余定理 + 模拟乘法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 题目大意:求C(n, m) % M, 其中M为不同素数的乘积,即M=p1*p2*...*pk, ...

  8. 【leetcode】1129. Shortest Path with Alternating Colors

    题目如下: Consider a directed graph, with nodes labelled 0, 1, ..., n-1.  In this graph, each edge is ei ...

  9. logback系列二:logback在项目中的应用

    1.输出http日志 2.输出dubbo日志 3.输出interfacer日志 4.输出到access,remote,app等目录中

  10. HTML和CSS实现图片翻转效果

    实现图片翻转,首先来分析一下我们希望实现的是怎样的翻转效果?又该如何去实现呢? 一.希望实现的效果 页面上的图片在光标悬停在上面的时候会发生翻转效果,翻转过后显示出背面的说明文字. 鼠标没有悬停在上面 ...