Android 组件 ContentProvider 的理解以及简单使用

本博客内容

  1. 简介ContentProvider所需要用到的技术的个人理解
  2. 示例:B应用取A应用的数据,然后将数据显示在B应用的控制台

更多参考:

  1. 官网ContentProvider
  2. 深入理解Android四大组件
  3. 示例地址

第一部分 个人理解

ContentProvider

作用 ,实现对A应用的数据库的操作

ContentResolver

 是 A应用 和 B应用 之间的沟通桥梁

UriMatcher类

通过这个来找到对应的操作对象(表)

ContentUris类(作用就是加id,具体干嘛,暂时不晓得)

操作Uri字符串的工具类,主要是拼接Uri字符串用
例如:
Uri  uri = Uri.parse("content://com.lzb.provide.myContentProvide:200/students");
Uri newUri = ContentUris.withAppendedId(uri,2);
// newUri = content://com.lzb.provide.myContentProvide:200/students/2。
long  id = ContentUris.parseId(newUri);  //用于从指定的Uri中解析出所包含的id
 // 解析出来的ID为2

第二部分实践操作

A 应用内:

AndroidManifest.xml

        <provider
            android:name=".NoteBookProvider"
            android:authorities="com.example.tnt.contentproviderdemo.NoteBookProvider"
            android:enabled="true"
            android:exported="true"></provider>

DBOpenHelper.java (创建数据库,以及表)

package com.example.tnt.contentproviderdemo;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBOpenHelper extends SQLiteOpenHelper {
    //数据库名
    private static final String DATA_BASE_NAME = "note.db";
    //数据库版本号
    private static final int DATE_BASE_VERSION = 1;
    public DBOpenHelper(Context context) {
        super(context, DATA_BASE_NAME, null, DATE_BASE_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
//        初始化表信息 无主键   只有 标题,日期
        String createTableNoteBookSQL = "create table "+NoteBook.NB_tableName+" ("+NoteBook.NB_title+" text ,"+NoteBook.NB_date+" text)";
        db.execSQL(createTableNoteBookSQL);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}

NoteBook.java (表的信息)

package com.example.tnt.contentproviderdemo;
public class NoteBook {
    // 表 NOTEBOOK_TABLE_NAME 的信息
    public static String NB_tableName = "NOTEBOOK_TABLE_NAME";
    public static String NB_title = "NOTEBOOK_TITLE";
    public static String NB_date = "NOTEBOOK_DATE";
}

NoteBookProvider.java (处理A数据库内容)

package com.example.tnt.contentproviderdemo;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
public class NoteBookProvider extends ContentProvider {
    private Context context;
    private SQLiteDatabase sqLiteDatabase;
    public static final String AUTHORITY = "com.example.tnt.contentproviderdemo.NoteBookProvider";
    public static final int NOTEBOOK_URI_CODE = 0;
    private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
    //    初始注册 uri
    static {
        URI_MATCHER.addURI(AUTHORITY, NoteBook.NB_tableName, NOTEBOOK_URI_CODE);
    }

    //    确定操作哪个表
    private String getTableName(Uri uri) {
        String tableName = null;
        switch (URI_MATCHER.match(uri)) {
            case NOTEBOOK_URI_CODE:
                tableName = NoteBook.NB_tableName;
                break;
        }
        return tableName;
    }
    public NoteBookProvider() {
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        String tableName = getTableName(uri);
        if (tableName == null) {
            throw new IllegalArgumentException("Unsupported URI:" + uri);
        }
        int count = sqLiteDatabase.delete(tableName, selection, selectionArgs);
        if (count > 0) {
            context.getContentResolver().notifyChange(uri, null);
        }
        return count;
    }

    @Override
    public String getType(Uri uri) {
        // TODO: Implement this to handle requests for the MIME type of the data
        // at the given URI.
        throw new UnsupportedOperationException("Not yet implemented");
    }
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        String tableName = getTableName(uri);
        if (tableName == null) {
            throw new IllegalArgumentException("Unsupported URI:" + uri);
        }
        //执行自己的插入操作代码块
        sqLiteDatabase.insert(tableName,null,values);
        context.getContentResolver().notifyChange(uri,null);
        return uri;
    }

    @Override
    public boolean onCreate() {
        // TODO: Implement this to initialize your content provider on startup.
        context = getContext();
        initProviderData();


        return false;
    }

    //    初始内容数据
    private void initProviderData() {
        sqLiteDatabase = new DBOpenHelper(context).getWritableDatabase();
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        String tableName = getTableName(uri);
        if (tableName == null) {
            throw new IllegalArgumentException("Unsupported URI:" + uri);
        }
        return sqLiteDatabase.query(tableName, projection, selection, selectionArgs, null, null, sortOrder, null);
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        String tableName = getTableName(uri);
        if (tableName == null) {
            throw new IllegalArgumentException("Unsupported URI:" + uri);
        }
        int row = sqLiteDatabase.update(tableName, values, selection, selectionArgs);
        if (row > 0) {
            context.getContentResolver().notifyChange(uri, null);
        }
        return row;
    }
}

MainActivity.java (插入操作和查询操作)

package com.example.tnt.contentproviderdemo;

import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private final String TAG = "MainActivity";
    public static final String AUTHORITY = "com.example.tnt.contentproviderdemo.NoteBookProvider";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Uri noteBookUri = Uri.parse("content://"+AUTHORITY+"/"+NoteBook.NB_tableName);
//
        ContentValues contentValues = new ContentValues();
        contentValues.put(NoteBook.NB_title,"特朗普连任");
        contentValues.put(NoteBook.NB_date,"20220401");
//
////        调用中间者 携带 数据过去
        getContentResolver().insert(noteBookUri,contentValues);
//
//        调用中间者 查询 数据
        Cursor noteBookCursor =  getContentResolver().query(noteBookUri,new String[]{NoteBook.NB_title,NoteBook.NB_date},null,null,null);
        if(noteBookCursor!=null)
        {
            while(noteBookCursor.moveToNext())
            {
                Log.e(TAG,"信息如下:"+noteBookCursor.getString(noteBookCursor.getColumnIndex(NoteBook.NB_title))+" "+noteBookCursor.getString(noteBookCursor.getColumnIndex(NoteBook.NB_date)));
            }
            noteBookCursor.close();
        }
    }
}

B应用

NoteBook.java(表的信息)

package com.example.getappdata;

public class NoteBook {
    // 表 NOTEBOOK_TABLE_NAME 的信息
    public static String NB_tableName = "NOTEBOOK_TABLE_NAME";
    public static String NB_title = "NOTEBOOK_TITLE";
    public static String NB_date = "NOTEBOOK_DATE";
}

MainActivity.java

package com.example.getappdata;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    private final String TAG = "MainActivity";
    public static final String AUTHORITY = "com.example.tnt.contentproviderdemo.NoteBookProvider";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Uri noteBookUri = Uri.parse("content://"+AUTHORITY+"/"+NoteBook.NB_tableName);
        //        调用中间者 查询 数据
        Cursor noteBookCursor =  getContentResolver().query(noteBookUri,new String[]{NoteBook.NB_title,NoteBook.NB_date},null,null,null);
        if(noteBookCursor!=null)
        {
            while(noteBookCursor.moveToNext())
            {
                Log.e(TAG,"信息如下:"+noteBookCursor.getString(noteBookCursor.getColumnIndex(NoteBook.NB_title))+" "+noteBookCursor.getString(noteBookCursor.getColumnIndex(NoteBook.NB_date)));
            }
            noteBookCursor.close();
        }
    }

}

B控制台输出:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38340601/article/details/82765277