欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-09 18:01:58
...

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)