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

来源:互联网 发布:java微信开发教程csdn 编辑:程序博客网 时间:2024/06/05 14:08

ContentProvider和ContentResolver


内容提供者是应用程序之间共享数据的接口,Android系统将这种机制应用到方方面面。比如:联系人提供者专为不同应用程序提供联系人数据;设置提供者专为不同应用程序提供系统配置信息,包括内置的设置应用程序等。


ContentProvider内容提供者的使用:


1.AndroidManifest.xml注册内容提供者

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.zhang.mycontentprovider">    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:roundIcon="@mipmap/ic_launcher_round"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <provider            android:name=".MyContentProvider"            android:authorities="com.MyContentProvider.db"            android:exported="true"></provider>    </application></manifest>

2.自定义一个MyContentProvider,它继承ContentProvider,在清单配置文件里,ContentProvider有一个属性authorities,这就是ContentProvider的身份证,所以一般为了保证唯一性,使用包名的方式命名.


ContentProvider提供几个重要的函数,MyContentProvider必须重载,这些函数(inset,query,update,delete)顾名思义就是对数据库的增删改查。


public class MyContentProvider extends ContentProvider {    SQL_zhuce sql_zhuce;    SQLiteDatabase sqLiteDatabase;    UriMatcher uriMatcher;    @Override    public boolean onCreate() {        sql_zhuce = new SQL_zhuce(getContext(), "数据库", null, 1);        sqLiteDatabase = sql_zhuce.getReadableDatabase();        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);        /*        authority 注意  这个参数和你在清单文件里面定义的要一样         */        uriMatcher.addURI("com.MyContentProvider.db", "query", 1);        uriMatcher.addURI("com.MyContentProvider.db", "insert", 2);        uriMatcher.addURI("com.MyContentProvider.db", "update", 3);        uriMatcher.addURI("com.MyContentProvider.db", "delete", 4);        return false;    }    @Nullable    @Override    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {        if (uriMatcher.match(uri) == 1) {            return sqLiteDatabase.query("数据表", projection, selection, selectionArgs, null, null, sortOrder);        }        return null;    }    @Nullable    @Override    public String getType(@NonNull Uri uri) {        return null;    }    @Nullable    @Override    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {        if (uriMatcher.match(uri) == 2) {            //操作数据库  说明路径匹配成功            SQLiteDatabase db = sql_zhuce.getReadableDatabase();            //返回值代表新 插入行数的id            long insert = db.insert("数据表", null, values);            db.close();//关闭数据库            Uri uri2 = Uri.parse("com.itheima.insert/" + insert);            return uri2;        }        return null;    }    @Override    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {        if (uriMatcher.match(uri) == 3) {            SQLiteDatabase db = sql_zhuce.getReadableDatabase();            //影响的行数            int update = db.update("数据表", values, selection, selectionArgs);            db.close();//关闭数据库            return update;        }        return -1;    }    @Override    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {        if (uriMatcher.match(uri) == 4) {            //说明路径匹配成功   对数据库进行删除的操作            SQLiteDatabase db = sql_zhuce.getReadableDatabase();            //代表影响的行数            int delete = db.delete("数据表", selection, selectionArgs);            db.close();//关闭数据库            return delete;        }        return -1;    }}

3.Android提供了ContentProvider,定义一个类去实现ContentProvider的抽象接口将自己的数据完全暴露出去。

在其他应用要操作暴露出来的数据,用ContentResolver内容解析者即可

1、从当前Activity获取系统的ContentResolver;

2、使用ContentProvider的insert、delete、update、query方法对ContentProvider的内容进行增删改查;

3、如果是使用query是的到一个Cursor的结果集,通过该结果集可以获得我们查询的结果。

返回值         函数声明

final Uri          insert(Uri url, ContentValues values)

final int         delete(Uri url, String where, String[] selectionArgs)

final Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

final int          update(Uri uri, ContentValues values, String where, String[] selectionArgs)

0 0
原创粉丝点击