1. 程式人生 > >Android四大元件之ContentProvider(內容提供者)

Android四大元件之ContentProvider(內容提供者)

ContentProvider是什麼

  • ContentProvider是Android中的四大元件之一,主要用於不用應用之間共享資料,通過ContentProvider把應用中的資料共享給其他應用訪問,其他應用可以通過ContentProvider對指定應用中的資料進行操作

ContentResolver是什麼

-ContentResolver意思是內容解析者,當需要對ContentProvider中的資料進行新增、刪除、修改和查詢操作時,就可以使用ContentResolver類來完成,通過Context物件中的getContentResolver()方法獲取該類的例項

URI是什麼,標準格式是什麼

  • Uri指定了將要操作的ContentProvider,其實可以把Uri看成網址,第一部分是"content://",類似網址於網址的"http://",第二部分是主機名“com.example.ContentTest”,用於唯一標識這個ContentProvider,第三部分是路徑名"/student",用來表示將要操作的資料。
"content://com.example.ContentTest/student"

UriMatcher是什麼

  • Uri代表了要操作的ContentProvider,那我們怎麼解析Uri,並從Uri中獲取資料呢。Android系統給我們提供了兩個用於操作Uri的工具類,分別為UriMatcher和ContentUris
  • UriMatcher本質是一個文字過濾器,使用UriMatcher就可以輕鬆實現匹配URI的功能,UriMatcher中提供了一個addURI()方法,第一個引數是就是主機名"content://com.example.ContentTest",第二個引數是路徑,第三個引數是匹配碼
uriMatcher.addURI("content://com.example.ContentTest", "student", 1);

如何使用ContentProvider

  • 建立一個ContentTest類繼承ContentProvider,並實現裡面的6個方法
  • onCreate()方法中獲取資料庫的物件,以及UriMatcher
    @Override
    public boolean onCreate() {
        Log.e(TAG, "onCreate: ");
        studentSql = new StudentSql(getContext(), "Student.db", null, 1);
        db = studentSql.getWritableDatabase();
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI("content://com.example.ContentTest", "student", 1);
        uriMatcher.addURI("content://com.example.ContentTest", "aaaaaaa", 2);
        return false;
    }
  • 然後在增刪改查四個方法中新增邏輯,通過uriMatcher.match(uri)獲得匹配碼
    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        Log.e(TAG, "query: ");
        Cursor cursor = null;
        switch (uriMatcher.match(uri)) {
            case 1:
                cursor = db.query("student", null, null, null, null, null, null);
                break;
            case 2:
                break;
            default:
                break;
        }
        return cursor;
    }
    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        Log.e(TAG, "insert: ");
        switch (uriMatcher.match(uri)) {
            case 1:
                db.insert("student", null, values);
                break;
            case 2:
                break;
            default:
                break;
        }
        return null;
    }
    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        Log.e(TAG, "delete: ");
        switch (uriMatcher.match(uri)) {
            case 1:
                db.delete("student", selection, selectionArgs);
                break;
            case 2:
                break;
            default:
                break;
        }
        return 0;
    }
    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        Log.e(TAG, "update: ");
        switch (uriMatcher.match(uri)) {
            case 1:
                db.update("student", values, selection, selectionArgs);
                break;
            case 2:
                break;
            default:
                break;
        }
        return 0;
    }
  • 之後在Activity中新增邏輯,獲取Uri
        uri = Uri.parse("content://com.example.ContentTest/student");
        contentResolver = getContentResolver();
  • 在點選事件中使用ContentResolver對ContentProvider中的資料進行新增、刪除、修改和查詢操作
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.insert:
                values.clear();
                name = studentName.getText().toString();
                id = Integer.parseInt(studentID.getText().toString());
                values.put("name", name);
                values.put("studentID", id);
                contentResolver.insert(uri,values);
                break;
            case R.id.update:
                values.clear();
                name = studentName.getText().toString();
                id = Integer.parseInt(studentID.getText().toString());
                values.put("name", name);
                values.put("studentID", id);
                contentResolver.update(uri,values,"name = ?", new String[]{name});
                break;
            case R.id.delete:
                name = studentName.getText().toString();
                contentResolver.delete(uri, "name = ?",new String[]{name});
                break;
            case R.id.query:
                List<StudentBean> list = new ArrayList<>();
                Cursor cursor = contentResolver.query(uri,null,null,null,null);
                if (cursor.moveToFirst()) {
                    do {
                        StudentBean studentBean = new StudentBean(cursor.getString(cursor.getColumnIndex("name")),
                                cursor.getInt(cursor.getColumnIndex("studentID")));
                        list.add(studentBean);
                    } while (cursor.moveToNext());
                }
                studentAdpaater = new StudentAdpaater(this,list);
                listView.setAdapter(studentAdpaater);
                break;
            default:
                break;
        }
    }