【android学习】四大组件-Content Provider(内容提供者)

1,概念

ContentProvider(内容提供者)是Android中的四大组件之一。用来管理和共享应用程序的数据库。提供数据的增删改查操作,数据源可以是数据库、文件、XML、网络等,ContentProvider为这些数据的访问提供了统一的接口,可以用来做进程间数据共享。

file, sqlite3, Preferences, ContentResolver与ContentProvider前三种数据操作方式都只是针对本应用内数据,程序不能通过这三种方法去操作别的应用内的数据。

android中提供ContenctResolver与ContentProvider来操作别的应用程序的数据。

比如要跨进程访问信息,可通过ContenctResolver的query、update、insert和delete方法即可。

2,分类

1)系统ContentProvider

如联系人,图片,音频,视频等数据。

2)自定义ContentProvider

3,实现

一个应用实现ContentProvider来提供内容给别的应用来操作;
一个应用通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以。

1)ContentProvider

Android提供了一些主要数据类型的ContentProvider,比如音频、视频、图片和私人通讯录等。可在android.provider包下面找到一些Android提供的ContentProvider。通过获得这些ContentProvider可以查询它们包含的数据,当然前提是已获得适当的读取权限。
组织数据类似数据库,可以包含多个表格,行表示一条数据,列对应一个字段。支持文件、图片、视频。

2)ContentResolver

当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的getContentResolver()方法。
ContentResolver可以不同URI操作不同的ContentProvider中的数据,外部进程可以通过ContentResolver与ContentProvider进行交互。

3)ContentObserver

观察ContentProvider中的数据变化,并将变化通知给外界。

4)实现

i>继承ContentProvider类,并实现6个抽象方法:onCreate query udate insert delete getType。
ii>注册MyProvider

<provider
    android:name=".provider.BookProvider"
    android:authorities="com.luo.test.provider"//ContentProvider的唯一标识,外部应用通过这个属性来访问它。必须唯一,所以命名时最好加上前缀。
    android:permission="com.luo.PROVIDER"//(不是必须的),增加了权限,外界应用访问时需要声明com.luo.PROVIDER权限,否则外界应用会异常终止。也可以通过android:readPermission和android:writePermission属性来设置读写权限。
    android:process=":provider">//表示运行在独立的进程(不是必须的)
</provider>

iii>本地数据库管理数据
建立一个简单的DbOpenHelper,继承SQLiteOpenHelper。
iv>ContentProvider关联Uri和Uri_Code
ContentProvider通过Uri来区分外界要访问的数据集合。

public class MyProvider extends ContentProvider{
    private static final String TAG = "ContentProvider";
    public static final String AUTHORITY = "com.luo.test.provider";
    public static final Uri USER_CONTENT_URI = Uri.parse("content://" + AUTHORITY +"/user");
    public static final Uri BOOK_CONTENT_URI = Uri.parse("content://" + AUTHORITY +"/book");

    public static final int BOOK_URI_CODE = 0;
    public static final int USER_CONTENT_CODE = 1;
    private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    static{
        uriMatcher.addURI(AUTHORITY,"book",BOOK_URI_CODE );//关联Uri和Uri_Code(USER_CONTENT_CODE和USER_CONTENT_URI )
        uriMatcher.addURI(AUTHORITY,"user",USER_CONTENT_URI );
    }
}

v>提供外界调用的CRUD方法

private String getTableName(Uri uri){
    String tableName = null;
    switch(uriMatcher.matcher(uri)){
        case BOOK_URI_CODE:
            table = DbOpenHelper.BOOK_TABLE_NAME;
            break;
        case ...
    }
    return tableName;
}
@Override
public Cursor query(Uri uri, String[] projection,String selection, String[] selectionArgs, String sortOrder){
    String table = getTableName(uri);
    if(table == null){
        throw new IllegalArgumentException("Unsupported URI" + uri);
    }
    return mDb.query(table, projection, selection, selectionArgs, null,null, sortOrder, null);
}

对于update insert delete方法会引起数据源变动(需要做好数据同步操作),我们需要通过ContentResolver的notityChange方法来通知外界当前ContentProvider数据发送改变。
通过ContentResolver的registerContentObservier方法注册观察者,通过unregisterContentObserver方法解除观察者。
vi>外界调用

Uri uri = Uri.parse("content://com.luo.test.provider");
getContentResolver().query(uri,null,null,null,null);

4,方法(CRUD + getType)

ContentProvider类种六个抽象方法。除了onCreate由系统回调并运行在主线程中(不能做耗时操作),,其它五个方法均由外界回调并运行在Binder线程池中(每个方法每次调用都在不同的线程中)。

1)onCreate()

初始化provider,创建ContentProvider。23

2)query()

返回数据给调用者

3)insert()

插入新数据到ContentProvider

4)update()

更新 ContentProvider已经存在的数据

5)delete()

从ContentProvider中删除数据

6)getType()

返回ContentProvider数据的MIME类型(媒体类型),比如图片、视频。
如果不关注这个选项,可以直接返回null或*/*

5,其它

1)Uri

Uri指定了将要操作的ContentProvider,其实可以把一个Uri看作是一个网址,我们把Uri分为三部分。

第一部分是”content://”。可以看作是网址中的”http://”。

第二部分是主机名或authority,用于唯一标识这个ContentProvider,外部应用需要根据这个标识来找到它。可以看作是网址中的主机名,比如”blog.csdn.net”。

第三部分是路径名,用来表示将要操作的数据。可以看作网址中细分的内容路径。

2)数据

①表格数据

ContentProvidder主要以表格的形式来组织数据,并且包含多个表,对于每个表格来说,具有行和列的层次性,行对应一条记录,列对应一条记录中的一个字段(类似数据库)。

②文件数据

比如图片、视频

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值