ContentProvider类的解析

一、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:通知当前数据发生改变

时间: 2024-10-13 12:11:14

ContentProvider类的解析的相关文章

内容提供者ContentProvider和内容解析者ContentResolver

简介 ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查.关于数据共享,以前我们学习过文件操作模式,知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据.那么,这里为何要使用ContentProvider 对

数据:ContentProvider类

一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露. Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法. 要想使应用程序的数据公开化,可通过2种 方法: 1)创建一个属于你自己的Content provider 2)将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入C

javap -- Java 类文件解析器

参考文档 http://blog.chinaunix.net/uid-692788-id-2681132.html http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javap.html 功能说明:Java 类文件解析器. 语法:javap [ 命令选项 ] class. . . 补充说明: javap 命令用于解析类文件.其输出取决于所用的选项.若没有使用选项,javap 将输出传递给它的类的 public 域及方法.ja

java笔记--String类对象解析与运用

1.String中的equals和==的区别 String是对象而非基本数据类型,不能使用"=="来判断两个字符串是否相当, 判断两个字符串内容是否相同用equals(); 判断两个字符串内存地址是否相同用"==" 2.startsWith(String str): 判断字符串是否以str为前缀 3.endsWith(String str): 判断字符串是否以str为后缀 4.String 字符串的比较: 1).compareTo()和compareToIgnore

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

运用.NET Framework类来解析HTML文件.读取数据并不是最容易的.虽然你可以用.NET Framework中的许多类(如StreamReader)来逐行解析文件,但XmlReader提供的API并不是“取出即可用(out of the box)”的,因为HTML的格式不规范.你可以用正则表达式(regular expression),但如果你对这些表达式运用不熟练,你可能开始时会觉得它们有些难. Microsoft的XML大师Chris Lovett最近在http://www.got

C#之Socket操作类实例解析

本文展示了一个C#的Socket操作类的完整实例,并附带了用法说明,分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Collections; using System.Net; using System.Runtime.Serializ

Android中直播视频技术探究之---基础核心类ByteBuffer解析

一.前言 前一篇文章我们介绍了Android中直播视频技术的基础大纲知识,这里就开始一一讲解各个知识点,首先主要来看一下视频直播中的一个重要的基础核心类:ByteBuffer,这个类看上去都知道了,是字节缓冲区处理字节的,这个类的功能非常强大,也在各个场景都有用到,比如网络数据底层处理,特别是结合网络通道信息处理的时候,还有就是后面要说到的OpenGL技术也要用到,当然在视频处理中也是很重要的,因为要处理视频流信息,比如在使用MediaCodec进行底层的视频流编码的时候,处理的就是字节,我们如

类不能解析

============问题描述============ import android.os.Bundle; import android.app.Activity; import android.view.Menu; ............. .......... setContentView(R.layout.EditText); 该语句中EditText显示不能解析而且clean无效,重新输入无效,其他android程序可运行. ============解决方案1============

ContentProvider类的设计分析

ContentProvider的类设计很好,Transport作为成员存在,完成Binder的功能,有点像组合模式,把完成转发/通信功能 封装为一个内部类,便于转发外部调用给外部类,这种设计在Android中广泛使用,若将Transport与ContentProvider合并,则会使类功能太复杂. debug发现,binder bn端每次接受请求后会启动一个新的线程处理,如query会启动新线程对象,执行完毕后,该线程结束.