ContentProvider是Android四大组件之一,用于系统中APP之间的联动与数据交换。

ContentProvider提供了6种方法可供开发者重写:

public boolean onCreate();

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder);

public String getType(Uri uri) ;

public Uri insert(Uri uri, ContentValues values);

public int delete(Uri uri, String selection, String[] selectionArgs);

public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs);

分别对应数据库的表的创建、判断类型、查、增、删、改。

 

使用方法:


1、新建类并继承ContentProvider

public class ProvideHelper extends ContentProvider {

2、将需要改写的6种方法放入该类中

 public boolean onCreate() {        return false;
    }
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        return null;
    }
    @Override
    public String getType(Uri uri) {
        return null;
    }
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {       return 0;
    }
    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }

3、配置AndroidManifest文件

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <provider
            android:authorities="fish.lsy.provide.work"
            android:name=".ProvideHelper"
            android:exported="true"/>

  其中,android:authorities即是其他类找到该类的地址;android:name即是这个provider类的名称;android:exported表示该类的方法能否被其他应用调用,选true就是可以。

4、在另一个软件中使用这些方法

1)申明ContentResolver 

 ContentResolver contentResolver;

2)建立变量储存Uri地址

Uri uri = Uri.parse("content://fish.lsy.provide.work/");

  PS:这里前面是要加"content://"的,后面的可照AndroidManifest中的android:authorities复制并加上"/"

3)调用contentResolver的方法

result = contentResolver.delete(uri,"name",null);

  contentResolver根据uri即可找到相应的应用,对其进行该应用所提供的操作。

5、其实,ContentProvider的6个方法只是构建了数据库方便使用的输入输出模式,方法的实现完全由开发者自定义和数据库毫无关系。

  但是,往往一个应用,不会只有一个表,因此,我们要为不同的表设置不同的操作。Android框架为我们提供了一个方便的类 UriMatcher我们可以通过它的方法来匹配Uri。

接上面的使用步骤

6、申明static的UriMatcher,并预设Uri地址和其中的表。

private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    static{
        uriMatcher.addURI("fish.lsy.provide.work","work1",1);
        uriMatcher.addURI("fish.lsy.provide.work","work2",2);
    }

  其中,UriMatcher.NO_MATCH为预设的常量-1,即当找不到匹配的Uri时,即会返回该值;而addURI的第三个参数,则是表示当Uri匹配成功时,返回的数值,据此我们可以对不同的匹配结果加以区分。

7、在ContentProvider对应的方法中对传来的Uri作判断。

public int delete(Uri uri, String selection, String[] selectionArgs) {
        switch (uriMatcher.match(uri)){
            case 1:
                if(selection.equals("lsysb")){
                    return 233;
                }
                return 111;
            case 2:
                if(selection.equals("xxysb")){
                    return 2333;
                }
                return 222;
            default:
                throw new IllegalArgumentException();
        }
    }

综上,ContentProvider为其他应用提供了操作本应用的方法,可以实现应用间的数据共享和操作。

posted on 2015-01-04 22:20  Fishbonell  阅读(138)  评论(0编辑  收藏  举报