四大组件之内容提供者

Posted 春招进大厂的梦想家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四大组件之内容提供者相关的知识,希望对你有一定的参考价值。

四大组件之内容提供者

创建内容提供者的步骤

1.编写一个类 继承自内容提供者

public class StudentScoreProvider extends ContentProvider {
    @Override
    public boolean onCreate() {
        return false;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
        return null;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
        return null;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
        return 0;
    }
}

2.在manifest中注册

就像活动啊,服务啊,都在在注册表里边进行注册

<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/Theme.ContentProvider_learning">
        <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:exported="true"
            android:authorities="com.example.contentprovider_learning"
            android:name=".provider.UserProvider"/>
    </application>

name我们知道,是这填写空上类的全路径名称。

authorities是什么呢?其实就是令牌,口令,暗号!对得上,匹配得了的,才有权限来操作数据库。

provider最好加多一项: android:exported=”true”

3.暂时先写一个查询的代码:

public class StudentScoreProvider extends ContentProvider {


    StudentScoreDBHelper mStudentScoreDBHelper;
    //定义一个Uri匹配器,参数表示不匹配的时候返回什么值,这里返回的是-1,也就是说-1表示不匹配
    private static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    //这个表示匹配
    private static final int CODE_MATCH = 1;

    static {
        //添加匹配规则,前面是authority,这个其实就是我们在配置文件里配置的那个认证字符串
        //第二个参数是path,一般表示表名
        //第三个表示the code that is returned when a URI is matched,也就是说规则匹配则会返回后面那个code
        // 否则返回前面我们指定的默认 UriMatcher.NO_MATCH
        mUriMatcher.addURI("com.example.contentprovider_learning","sob_score",CODE_MATCH);
    }

    @Override
    public boolean onCreate() {
        //注意,这里getContext()
        //Only available once
        //     * {@link #onCreate} has been called
        //里面的注释是:只有当onCreate方法被调用以后,getContext这个方法才可用。
        mStudentScoreDBHelper = new StudentScoreDBHelper(getContext());
        return false;
    }


    @Override
    public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
        int match = mUriMatcher.match(uri);
        if (match==CODE_MATCH) {
            SQLiteDatabase readableDatabase = mStudentScoreDBHelper.getReadableDatabase();
            return readableDatabase.query(StudentScoreDBHelper.TABLE_NAME, strings, s, strings1, s1, null, null);
        }else{
            throw new IllegalArgumentException("Uri not matching.");
        }
    }


    @Override
    public String getType( Uri uri) {
        return null;
    }

    
    @Override
    public Uri insert( Uri uri,  ContentValues contentValues) {
        return null;
    }

    @Override
    public int delete( Uri uri,  String s,  String[] strings) {
        return 0;
    }

    @Override
    public int update( Uri uri,  ContentValues contentValues,  String s,  String[] strings) {
        return 0;
    }
}

4.写另外一个应用,通过内容提供者的方式来获取当前应用的内容

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void getScore(View view) {
        ContentResolver contentResolver = this.getContentResolver();
        Uri uri = Uri.parse("content://com.sunofbeaches.providerdemo/sob_score");
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        while (cursor.moveToNext()) {
            Log.d(TAG, "id is -- > " + cursor.getInt(0));
            Log.d(TAG, "name is -- > " + cursor.getString(1));
            Log.d(TAG, "Chinese is -- > " + cursor.getInt(2));
            Log.d(TAG, "Math is -- > " + cursor.getInt(3));
            Log.d(TAG, "English is -- > " + cursor.getInt(4));
        }
        cursor.close();
    }
}

在xml文件下只需要添加一个按钮就可以

最后点击此按钮就可以获取到我们之前创建的活动的数据库里面的内容了

内容观察者

内容提供者-内容观察者 (sunofbeach.net)

获取联系人信息

/**
     * 点击获取联系人信息
     *
     * @param view
     */
    public void getUserCall(View view) {
        getUserInfo();
    }

    private void getUserInfo() {
        ContentResolver cr = getContentResolver();
        Uri rawContactUri = Uri.parse("content://" + ContactsContract.AUTHORITY + "/raw_content");

        Cursor cursor = cr.query(rawContactUri, new String[]{"contact_id", "dispaly_name"}, null, null, null);
        String[] columnNames = cursor.getColumnNames();
        while (cursor.moveToNext()) {
            for (String columnName:columnNames) {
                Log.d(TAG, columnNames+"values -----> "+cursor.getString(cursor.getColumnIndex(columnName)));
            }
        }
    }

是固定写法了

首先需要一个ContentResolver来进行接收;

然后需要一个Uri来确定你想要进行什么操作。

再来一个游标Cursor,实例化为ContentResolver.query();

最后获取列名,String[] columnNames = cursor.getColumnNames();,然后遍历就是了。

从媒体库获得图片并显示出来

这里已经有了很详细的笔记,直接给链接就好了。https://blog.csdn.net/twenty_four_7/article/details/117336685

以上是关于四大组件之内容提供者的主要内容,如果未能解决你的问题,请参考以下文章

Android面试四大组件之内容提供者ContentProvider

入职小白随笔之Android四大组件——内容提供器详解(Content Provider)

安卓基础之 四大基本组件介绍与生命周期

Android四大组件之服务的两种启动方式详解

四大组件之ContentProvider-使用系统提供的ContentProvider

Android四大组件之一:ContentProvider(内容提供者)