注册ContentProvider:

<provider
android:name=".provider.UserProvider"
android:authorities="com.rw.contentprovider.provider.UserProvider"
android:exported="true"
></provider>

其中authorities是URI中的域名部分,可以随便取,但必须在整个系统中唯一

      name和ACtivity一样,告诉虚拟机与之绑定的class

       exported指定ContentProvider是否允许被其他应用调用

继承ContentProvider的以下5个方法:

可以根据自己的业务需求,实现相应的方法

以下是自己写的demo,有之前写的DBOpenHelper类的支持

public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) { SQLiteDatabase dataBase= this.userDatabase.getReadableDatabase();
switch (USERMATCHER.match(uri)) {
case USER:
long rawId= ContentUris.parseId(uri);
String where="uid="+rawId;
if(selection!=null){
where+=" and "+selection;
}
return dataBase.query("users", projection, where, selectionArgs, null, null,sortOrder); case USERS:
return dataBase.query("users", projection, selection, selectionArgs, null,null, sortOrder);
default:
throw new IllegalArgumentException("this unknown Uri:"+uri.toString()); }
}
public String getType(Uri uri) {
switch (USERMATCHER.match(uri)) {
case USER:
return "vnd.android.cursor.dir/user";
case USERS:
return "vnd.android.cursor.item/user"; default: throw new IllegalArgumentException("this is unknown Uri:"+uri.toString());
}
}
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase dataBase= this.userDatabase.getWritableDatabase();
switch (USERMATCHER.match(uri)) {
case USER: throw new IllegalArgumentException("this Uri can not insert a record to Content!"); case USERS:
long rawId=dataBase.insert("users", null, values); return ContentUris.withAppendedId(uri, rawId);
default: throw new IllegalArgumentException("this unknown Uri:"+uri.toString());
}
}
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase dataBase= this.userDatabase.getWritableDatabase();
switch (USERMATCHER.match(uri)) {
case USER:
long rawId= ContentUris.parseId(uri);
String where="uid="+rawId;
if(selection!=null){
where+=" and "+selection;
}
return dataBase.delete("users", where, selectionArgs);
case USERS: return dataBase.delete("users", selection, selectionArgs);
default: throw new IllegalArgumentException("this unknown Uri:"+uri.toString());
}
}
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
SQLiteDatabase dataBase=userDatabase.getWritableDatabase();
switch (USERMATCHER.match(uri)) {
case USER:
long rawId= ContentUris.parseId(uri);
String where="uid="+rawId;
if(selection!=null){
where+=" and "+selection;
}
return dataBase.update("users", values, where, selectionArgs);
case USERS:
if(selection!=null){
return dataBase.update("users", values, selection, selectionArgs);
}else{
throw new IllegalArgumentException("this Uri con not update record from dataBase");
}
default: throw new IllegalArgumentException("this Uri is unknown:"+uri.toString());
}
}

在使用者使用ContentResolver对数据进行CURD操作时,分别调用了与之对应的的方法,其实其底层也是根据URI获取到了这个ContentProvider,进而将参数传递给ContentProvider中与之对应的方法。以下是其中一类的Code

public final int update(Uri uri, ContentValues values, String where,
String[] selectionArgs) { //在这里根据传入的Uri,获取到一个ContentProvider
IContentProvider provider = acquireProvider(uri);
if (provider == null) {
throw new IllegalArgumentException("Unknown URI " + uri);
}
try {
long startTime = SystemClock.uptimeMillis(); //在这里真正执行ContentProvider的update方法
int rowsUpdated = provider.update(mPackageName, uri, values, where, selectionArgs);
long durationMillis = SystemClock.uptimeMillis() - startTime;
maybeLogUpdateToEventLog(durationMillis, uri, "update", where);
return rowsUpdated;
} catch (RemoteException e) {
// Arbitrary and not worth documenting, as Activity
// Manager will kill this process shortly anyway.
return -1;
} finally {
releaseProvider(provider);
}
}

ContentProvider(一)的更多相关文章

  1. Android之ContentProvider数据存储

    一.ContentProvider保存数据介绍 一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数 ...

  2. Xamarin.Android之ContentProvider

    一.前言 掌握了如何使用SQLiteOpenHelper之后,我们就可以进行下一步的学习.本章我们将会学习如何使用ContentProvider来将数据库方面的操作封装起来,同时它还可以供其他应用访问 ...

  3. ContentProvider域名替换小工具

    开发项目域名想怎么换就怎么换,就是这么任性! 这是一个很有意思的小工具! 这是一个方便开发人员和测试人员的小工具!! 吐槽: 一直在做Android开发,一直总有一个问题存在:做自己公司的apk开发时 ...

  4. Android开发学习—— ContentProvider内容提供者

    * 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的数据库.把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用. Uri:包含一个具有一定格式的字符串的对 ...

  5. 简单的学习心得:网易云课堂Android开发第六章SQLite与ContentProvider

    一.SQLite 1.基本操作: (1)创建数据库:在SQLiteOpenHelper的子类构造器中创建. (2)创建表:在SQLiteOpenHelper的子类onCreate方法中,调用execS ...

  6. ContentProvider中央档案馆,以及获取联系人电话的示例

    Android官方文档介绍的数据存储方式共有五种,sqlite,SharedPreferences,网络存储,外储存储,文件存储,但是这些数据都无法进行共享,那么我们就引入了今天的主角:Content ...

  7. Android基础 : Android ContentProvider

    Android 应用程序通过ContentProvider实现方式统一的数据共享功能. 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activi ...

  8. 安卓初級教程(3):ContentProvider的運用原理

    package com.example.android.provider; import java.util.ArrayList; import java.util.HashMap; import j ...

  9. Android探索之ContentProvider熟悉而又陌生的组件

    前言: 总结这篇文章之前我们先来回顾一下Android Sqlite数据库,参考文章:http://www.cnblogs.com/whoislcj/p/5506294.html,Android程序内 ...

  10. 四大组件之ContentProvider

    前言 ContentProvider作为Android的四大组件之一,是属于需要掌握的基础知识,可能在我们的应用中,对于Activity和Service这两个组件用的很常见,了解的也很多,但是对Con ...

随机推荐

  1. C#操作Excel的OLEDB方式与COM方式比较

    2013-03-15 13:42:54      作者:有理想的码农   在对Excel进行读写操作时,使用微软自身提供的解决方案,有两种(第三方方式除外),分别是OLEDB方式和调用COM组件的方式 ...

  2. 大一上C语言期末大作业-成绩管理系统

    都过了半年的作业了,觉得做过去得留下点什么,所以整理了代码发一下博客. 声明:程序在DevC++下用c文件模式可以正常编译使用.(控制台程序) 程序结构:

  3. Linux下安装、启动MySQL

    启动与停止 1.启动 MySQL安装完成后启动文件mysql在/etc/init.d目录下,在需要启动时运行下面命令即可. [root@localhost mysql]# /etc/init.d/my ...

  4. UVa532 Dungeon Master 三维迷宫

        学习点: scanf可以自动过滤空行 搜索时要先判断是否越界(L R C),再判断其他条件是否满足 bfs搜索时可以在入口处(push时)判断是否达到目标,也可以在出口处(pop时)   #i ...

  5. ZOJ 1151 Word Reversal反转单词 (string字符串处理)

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=151 For each list of words, output a l ...

  6. 怎么去掉li标签前面的点??

    <ul class="list"> <li> </li> <li> </li> </ul> .list li ...

  7. android访问webservices

    /** * 手机号段归属地查询(模拟器.HTC 可以) *  * @param phoneSec 手机号段 */ public  void getRemoteInfo() { /*String pho ...

  8. 前端框架Bootstrap

    前端框架Bootstrap http://www.bootcss.com/ Bootstrap 编码规范 http://codeguide.bootcss.com/

  9. jquery中获取当前点击对象

    jquery中获取当前点击对象的简单方法就是,在点击事件click中传入event对象 click(function(event)); 调用当前对象就是$(event.target);

  10. android149 360 程序锁输入密码

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...