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。
 

最新文章

  1. 谈谈pooling?
  2. 点透 &amp; 解决方案
  3. Yii2请求,报400错误
  4. OpenGL拾取注意事项
  5. linux mount (挂载命令)详解
  6. Java基础知识强化之IO流笔记73:NIO之 Channel
  7. List.Select按字符串选择属性
  8. android studio 突然出现Gradle project sync failed 错误
  9. PHP ORM框架与简单代码实现(转)
  10. SIP基本呼叫
  11. 使用onclick跳转到其他页面。使用button跳转到指定url
  12. LCD驱动移植在在mini2440(linux2.6.29)和FS4412(linux3.14.78)上实现对比(deep dive)
  13. DotNetCore 定时服务 HangFire
  14. js实现点气球小游戏
  15. 【Python 19】BMR计算器3.0(字符串分割与格式化输出)
  16. vue项目启动时将localhost替换成指定ip地址
  17. 求一个集合的所有真子集 Python
  18. 三 、 Multivariance Linear Regssion练习(转载)
  19. Vuejs2.0学习(Render函数,createElement,vm.$slots)
  20. mysql5.7 主从同步

热门文章

  1. Period II
  2. Python 入门之 内置模块 -- time模块
  3. Python 入门之Python基础数据类型及其方法
  4. 【问题解决方案】Xshell连接服务器并实现上传和下载文件
  5. react搭建
  6. SpringMVC拦截器(资源和权限管理)
  7. jQuery学习总结06-插件开发
  8. c语言之ascii字符
  9. java打印树形目录结构
  10. 【串线篇】spring boot嵌入式Servlet容器启动原理;