注册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. Lua学习笔记(三):函数和闭包

    函数 lua的函数以function关键字开始,后跟函数名称和参数,最后以end结束,我们看一个简单的函数定义: function foo() --do something end function ...

  2. socket的shutdown与close

    shutdown原型 int shutdown(int socket, int how); socket 指定socket的文件描述符 how    指定shutdown的类型 SHUT_RD 禁止读 ...

  3. AngularJS~集成的ajax和服务的注入

    AngularJS很美,以至于迷倒了不少年青人和我这位大叔,它的美不仅仅是在写法上,而且在设计方法上都进乎于完美,用什么服务就注入什么服务,这样方法本来就很直观,程序员感觉直观了,程序在运行起来也按需 ...

  4. I/O流的学习

    一.I/O流 1.判定是输入还是输出我们应该站在程序的立场: 2.判断传输的是字节还是字符,从而决定管道的大小,字节传递是根本,可以传递所有的数据类型,字符传递专门用来传递文本数据,字节主要用来传递二 ...

  5. Js面向对象和数据类型内存分配(转)

    一 Js基本数据类型以及内存情况 1 Undefined Undefined类型只有一个值undefined,在使用了声明但未初始化的变量的时候,这个变量值就是undefined 1 var hi; ...

  6. extjs grid renderer用法【转载】

    今天在做项目时,需要在列表中的某列添加一个超链接,首先要取得当前选中行的数据,判断数据类型,然后链接到不同的页面,研究下.发现ExtJs提供了一个很强的方法如下: var cm = new Ext.g ...

  7. 【经验记录】Android上传文件到服务器

    Android中实现上传文件,其实是很简单的,和在java里面是一样的,基本上都是熟悉操作输出流和输入流!还有一个特别重要的就是需要配置content-type的一些参数!如果这些都弄好了,上传就很简 ...

  8. thinkphp分配数组

    TestAction.class.php 的edit方法中 $this->assign('list',array('one'=>'a','two'=>'b')); 后,在edit.h ...

  9. DWRUtil is not defined

    错误:DWRUtil is not defined; 解决方法: 先检查页面中是否正确引入uitl.js <script type="text/javascript" src ...

  10. MySQL锁系列3 MDL锁

    http://www.cnblogs.com/xpchild/p/3790139.html   MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...