Android四大组件—内容提供器(Content Provider)使用方法

内容提供器是Android四大组件之一,主要用于实现不同应用程序之间的数据共享。简单来说,内容提供器相当于一个接口,其他应用程序可以通过这个接口来访问该程序的数据。内容提供器内的数据是被许可访问的,其他隐私数据无法通过内容提供器访问,从而保证了数据的安全性。

内容提供器内的数据是通过内容URI来标识的,内容URI包含两部分:authority和path。authority用来区分不同的应用程序,通过使用包名来区分,比如:com.example.test.provider。path用来区分同一个程序内不同的数据表,比如:/table1。所以完整的内容URL为:content://com.example.test.provider/table1,表示想访问的的数据是应用程序test内表table1的数据。

1.创建内容提供器

新建一个MyProvider类去继承ContentProvider类。ContentProvider类有6个抽象方法,分别是onCreate()、query()、insert()、update()、delete()、getType()。这6个抽象方法都要在子类中进行重写。

在MyProvider类中使用到了一个UriMatcher类,通过UriMatcher类实现内容URI的匹配功能。具体代码如下:

public class MyProvider extends ContentProvider{
    
    public static final int TABLE1_DIR = 0;

    public static final int TABLE2_ITEM = 1;

    public static final int TABTLE3_ITEM = 2;

    public static final int TABTLE4_ITEM = 3;

    private static UriMatcher uriMatcher;

    static{
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI("com.example.app.provider","table1",TABLE1_DIR);
        uriMatcher.addURI("com.example.app.provider","table1/#",TABLE1_DIR);
        uriMatcher.addURI("com.example.app.provider","table2",TABLE1_DIR);
        uriMatcher.addURI("com.example.app.provider","table2/#",TABLE1_DIR);
    }

    @Override
    public Cursor query(Uri uri,String[] projection, String selection, String[] selectionArgs, String sortOrder){
        switch(uriMatcher,match(uri)){
            case TABLE1_DIR:
                //查询table1表中的所有数据
                break;
            case TABLE1_ITEM:
                //查询table1表中的单条数据
                break;
            case TABLE1_DIR:
                //查询table2表中的所有数据
                break;
            case TABLE1_DIR:
                //查询table2表中的单条数据
                break;
            default:
                break;
        }
    }
}
        

2.内容解析器

访问内容提供器内的数据需要借助内容解析器(ContentResolver),通过Context的getContentResolver()方法可以获取到内容解析器的实例。具体代码如下:

Uri uri = Uri.parse("content://com.example.app.provider/table1")
Cursor cursor = getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder);
if(cursor!=null){
    while(cursor.moveToNext()){
        String column1 = cursor.getString(cursor.getColumnIndex("column1"));
        int column2 = cursor.getInt(cursor.getColumnIndex("column2"));
    }
    cursor.close();
}

 

你可能感兴趣的:(Provider)