第十三周安卓开发学习总结(1)
写在前面
最近事情多了起来,趁还有点闲工夫,学习了安卓四大组件的最后一个组件——ContentProvider,内容提供者。内容提供者的作用就是将自己的数据库暴露给别的APP,让别的APP可以操作。应用场景其实比较有限,所以之前没有学习。常见的应用场景有,微信提取联系人目录,各种商城APP自动添加提醒日程等等。大部分都是与系统的APP进行交互,从而实现一些比较方便的功能。比如刚截了一张屏QQ就会提示你有新图片要发,就是使用了ContentProvider来实现的。
ContentProvider的基本使用
要将自己的数据库暴露出去,首先要有一个数据库。使用Sqlite的方法这里就不再赘述了。建立好数据库后,设置内容提供者:
public class UserProvider extends ContentProvider {
private static final String TAG = "UserProvider";
private UserDatabaseHelper mUserDatabaseHelper=null;
private static final int USER_MATCH_CODE = 1;
private static UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sUriMatcher.addURI("com.androidlearing.contentpeovider","user",USER_MATCH_CODE);
}
@Override
public boolean onCreate() {
mUserDatabaseHelper = new UserDatabaseHelper(getContext());
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
int result = sUriMatcher.match(uri);
if(result==USER_MATCH_CODE){
//匹配规则
SQLiteDatabase db = mUserDatabaseHelper.getReadableDatabase();
Cursor cursor = db.query(Constants.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
return cursor;
}else{
//不匹配规则
throw new IllegalArgumentException("参数错误");
}
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
int result = sUriMatcher.match(uri);
if(result==USER_MATCH_CODE){
SQLiteDatabase db = mUserDatabaseHelper.getWritableDatabase();
long id = db.insert(Constants.TABLE_NAME, null, values);
Uri resultUri =Uri.parse("content://com.androidlearing.contentpeovider/user/"+id);
Log.d(TAG,"insert user result -->"+id);
//插入数据成功,数据已经变化,通知其他地方
getContext().getContentResolver().notifyChange(resultUri,null);
return resultUri;
}else{
throw new IllegalArgumentException("参数错误!");
}
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
}
这里只复写了query和insert方法,其他的方法也大致相同,就不再写了。
四大组件都需要在配置文件中注册,内容提供者也是。我们注册一下:
<provider
android:exported="true"
android:authorities="com.androidlearing.contentpeovider;userProvider"
android:name=".provider.UserProvider"/>
之后我们再写一个第三方应用来操作该应用的数据库,也就是ContentResolver:
/**
* 点击的时候我们去获取
* @param v
*/
public void getRemoteUsers(View v){
ContentResolver contentResolver = getContentResolver();
Uri uri = Uri.parse("content://com.androidlearing.contentpeovider");
Cursor cursor = contentResolver.query(uri, null, "username = ?", new String[]{"fuck"}, null);
String[] columnNames = cursor.getColumnNames();
for(String columnName:columnNames){
Log.d(TAG,"columnName -->"+columnName);
}
while(cursor.moveToNext()){
for(String columnName: columnNames){
String value = cursor.getString(cursor.getColumnIndex(columnName));
Log.d(TAG,"=================");
Log.d(TAG,columnName+"======="+value);
}
Log.d(TAG,"=================");
}
cursor.close();
}
这里的uri里的路径要跟我们之前设置的一致。经过测试无误。
总结
内容提供者的基本内容就到这了。这周如果有时间会做几个案例试试,学习一下具体的使用场景。