一、ContentProvider类

1.作用:专门用于不同应用之间进行数据共享的方式。

二、实现方法

1.创建ContenteProvider类

步骤一:继承ContentProvider接口,重写接口的方法

/*其他方法都好理解*/
public class BookProvider extends ContentProvider { @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
/*返回一个Uri请求所对应的MIME类型,如果不关心可直接返回null*/
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;
}
}

步骤二:在AndroidManifest.xml中注册

<provider
android:authorities="com.chen.android.provider"
android:name=".BookProvider"
android:process=":provider">
</provider>

其中android:authorities是Provider的唯一标识,外界应用必须声明相应的权限才能进行操作。

2.应用访问该ContentProvider

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Uri uri = Uri.parse("content://com.chen.android.provider");
getContentResolver().query(uri,null,null,null,null);
}

content://com.chen.android.provider:唯一标识了BookProvider属性。

通过Activity的ContentProvider管理器,利用Uri指定ContentProvider,并调用指定方法。

注:方法的调用是在Binder线程中的,而不是在Activity的onCreate()方法中

3.创建数据库(辅助)

如何创建数据库:SQLite的使用 和 第一行代码的示例

注:创建了名为Book和User两个Table

public class DbOpenHelper extends SQLiteOpenHelper {
private static final String DBNAME = "book_provider.db";
public static final String BOOK_TABLE_NAME = "book";
public static final String USER_TABLE_NAME = "user"; private String CREATE_BOOK_TABLE = "create table if ont exists"+BOOK_TABLE_NAME+"(_id INTEGER PRIMARY KEY,name TEXT)";
private String CREATE_USER_TABLE = "create table if not exists"+USER_TABLE_NAME
+"(_id INTEGER PRIMARY KEY,"+"name TEXT)";
public DbOpenHelper(Context context, int version) {
super(context, DBNAME, null, version);
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_USER_TABLE);
db.execSQL(CREATE_BOOK_TABLE);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}

4.利用ContentProvider访问其中一个Table

为了知道外界访问是哪一张表,需要定义单独的Uri和Uri_Code,让Uri和Uri_Code相连。

利用UriMatch的addURI方法将两者关联起来。

/*
*BookProvider类中
*/ private static final String AUTHORY = "com.chen.android.provider";
private static final int BOOK_URL_CODE = 0;
private static final int USER_URL_CODE = 1;
private static final UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
   //稍后用到这个变量
private String tableName;
@Override
public boolean onCreate() {
//访问权限之后为访问Book的地址(content://com.chen.android.provider/book),如果对则返回BOOK_URL_CODE
mUriMatcher.addURI(AUTHORY,"book",BOOK_URL_CODE);
     //同上
mUriMatcher.addURI(AUTHORY,"user",USER_URL_CODE);
return false;
}

获取客户端要访问的Table

//步骤一:利用客户端的uri选择出table名
public String getTableName(Uri uri){
String tableName = null;
switch (mUriMatcher.match(uri)){
case BOOK_URL_CODE:
tableName = DbOpenHelper.BOOK_TABLE_NAME;
break;
case USER_URL_CODE:
tableName = DbOpenHelper.USER_TABLE_NAME;
break;
}
return tableName;
}
//步骤二:在ContentProvider中创建DbOpenHelper
private DbOpenHelper mDbOpenHelper;
private Context mContext; @Override
public boolean onCreate() {
....
mContext = getContext();
mDbOpenHelper = new DbOpenHelper(mContext,1);
return false;
}
//步骤三:利用ContentProvider的query()其他方法也是一样的形式
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
table = getTableName(uri);
return mDbOpenHelper.getWritableDatabase().query(table,projection,selection,selectionArgs,null,null,sortOrder,null);
}

客户端:将Uri uri = Uri.parse("content://com.chen.android.provider");

改写成Uri uri = Uri.parse("content://com.chen.android.provider/book"); 这样就可以访问BookTable了

注:update、insert、delete会引起源数据的改变,需要通过ContentProvider通知外界改变

5.ContentProvider通知外界数据改变(暂时不知道怎么用)

registerContentObserver:注册观察者

unRegisterContentObserver:取消观察者

notifyChanged:通知当前数据发生改变

ContentProvider类的解析的更多相关文章

  1. 如何利用.Net内置类,解析未知复杂Json对象

    如何利用.Net内置类,解析未知复杂Json对象 如果你乐意,当然可以使用强大的第三方类库Json.Net中的JObject类解析复杂Json字串 . 我不太希望引入第三方类库,所以在.Net内置类J ...

  2. Java 8 Optional 类深度解析

    Java 8 Optional 类深度解析 身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只 ...

  3. javap -- Java 类文件解析器

    参考文档 http://blog.chinaunix.net/uid-692788-id-2681132.html http://docs.oracle.com/javase/7/docs/techn ...

  4. 解析HTML文件 - 运用SgmlReader类来解析HTML文件

    运用.NET Framework类来解析HTML文件.读取数据并不是最容易的.虽然你可以用.NET Framework中的许多类(如StreamReader)来逐行解析文件,但XmlReader提供的 ...

  5. 数据:ContentProvider类

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

  6. Java File类基础解析 1

    Java File类基础解析 1 File类的构造方法 public File(String pathname) :通过给定的路径名字符转换为抽象路径名来创建新的File实例 String path ...

  7. 共享参数ContentProvider 类与数据库绑定,如何通过共享参数测试类,测试数据库的增删改查功能

    Intent可以传一个对象 当两个界面之间跳转时,需要传递一个对象过去,是通过使用Bundle类,并且实体类需要serializable实现序列化,传递方法如下: 定义一个静态常量作为key值 pub ...

  8. 第一个OC类、解析第一个OC程序

    01第一个OC 类 本文目录 • 一.语法简介 • 二.用Xcode创建第一个OC的类 • 三.第一个类的代码解析 • 四.添加成员变量 • 五.添加方法 • 六.跟Java的比较 • 七.创建对象 ...

  9. Spring mybatis源码篇章-NodeHandler实现类具体解析保存Dynamic sql节点信息

    前言:通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-XMLLanguageDriver解析sql包装为SqlSource SqlNode接口类 publi ...

随机推荐

  1. 基于excel9.h的excel处理

    基于excel9.h的excel处理; #include "excel9.h" #include <iostream> using namespace std; cla ...

  2. Python闭包及装饰器

    Python闭包 先看一个例子: def outer(x): def inner(y): return x+y return innder add = outer(8) print add(6) 我们 ...

  3. PHP封装Excel表方法使用流程

    今天总结了一下Excel表的封装和导出使用,原理 经常使用与一些日常报表, 数据报表, 实现方法比较简单, 一次封装, 简单的方法调用,简单~ 废话不多说,直接入正题, 先说下重要的参数要记住的东西 ...

  4. php.ini 全站,和htaccess web目录 默认头部和尾部 auto_prepend_file

    php.ini ; Automatically add files before PHP document. ; http://php.net/auto-prepend-file auto_prepe ...

  5. django接收和发送json数据

    通过json.jumps处理字典数据, 发送给前端 def get_context_data(self, **kwargs): ctx = super(HelpUpdateView, self).ge ...

  6. c语言 列出-终止系统进程

    #include <stdio.h> #include "stdafx.h" #include <Windows.h> #include <strin ...

  7. win7 PHP7.0的PDO扩展

    一个非常棘手的问题,win7(64位)环境,编译安装的mysql,php无法使用pdo扩展. 而我的centos中yum安装的php,pdo是好用的. 百度了一大堆,都无法解决. 基本上百度到的都是要 ...

  8. TensorFlow 深度学习笔记 卷积神经网络

    Convolutional Networks 转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有问题可以到Is ...

  9. 解决nginx上传模块nginx_upload_module传递GET参数

    解决nginx上传模块nginx_upload_module传递GET参数的方法总结 最近用户反映我们的系统只能上传50M大小的文件, 希望能够支持上传更大的文件. 很显然PHP无法轻易实现大文件上传 ...

  10. 安全运维之:Linux系统账户和登录安全(转)

    三.删减系统登录欢迎信息 系统的一些欢迎信息或版本信息,虽然能给系统管理者带来一定的方便,但是这些信息有时候可能被黑客利用,成为攻击服务器的帮凶,为了保证系统的安全,可以修改或删除某些系统文件,需要修 ...