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为其他应用提供了操作本应用的方法,可以实现应用间的数据共享和操作。