当前位置 博文首页 > 庆述倾述:ContentProvider内容提供者
如果一个应用程序通过ContentProvider
对其数据提供了外部访问接口,那么任何其他应用程序都可以对这部分数据进行访问。
类似于数据库的操作进行数据的访问。在ContentProvider
中使用URI
来进行标识。比如:
Uri uri = Uri.parse("content://com.example.app.provider/table1");
观察上面的Uri
知道它可以清楚的表达我们想要访问哪个程序,哪个表中的数据。在ContentProvider
进行访问或者共享自己数据的时候,需要使用ContentResolver
类来进行操作,这个操作就类似于前面数据库的CRUD
操作。
我们知道Android
自带的通讯录、短信、媒体库等程序都提供了类似的访问接口。那么不妨以访问通讯录为案例:
① 添加权限;
<uses-permission android:name="android.permission.READ_CONTACTS"/>
② 动态权限申请、数据获取:
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
Button button = findViewById(R.id.id_button_insert);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//权限检查
if (ContextCompat.checkSelfPermission(TestActivity.this,
Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
//申请权限
ActivityCompat.requestPermissions(TestActivity.this,
new String[]{Manifest.permission.READ_CONTACTS}, 1);
}
readAccount();
}
});
}
private void readAccount() {
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, null, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
));
String number = cursor.getString(cursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER
));
Toast.makeText(getApplicationContext(),
"name="+name+" number="+number, Toast.LENGTH_LONG).show();
}
cursor.close();
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 1){
if(grantResults.length < 0
|| grantResults[0] == PackageManager.PERMISSION_DENIED){
Toast.makeText(getApplicationContext(),
"You denied the premission!", Toast.LENGTH_LONG).show();
}
}
}
}
ContentProvider
共享本应用数据ContentProvider
类;对于URI
有几种写法:
content://com.example.app.provider/table1
标识到该应用的具体表名;content://com.example.app.provider/table1/1
标识到该应用具体表的id
为1
的数据;content://com.example.app.provider/*
标识到该应用下的任意表;content://com.example.app.provider/table1/#
标识到该应用table1
表下的任意一条数据;①创建一个MyContentProvider
用于暴露自己的共享数据:
public class MyContentProvider extends ContentProvider {
private static UriMatcher uriMatcher;
private SQLiteDatabase db;
private static final String tableName = "Book";
@Override
public boolean onCreate() {
MySQLiteOpenHelper mySQLiteOpenHelper = new MySQLiteOpenHelper(getContext(), tableName, null, 3);
db = mySQLiteOpenHelper.getWritableDatabase();
return true; // true表示初始化成功,false表示初始化失败
}
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("com.weizu.send_message.provider", "table", 0);
uriMatcher.addURI("com.weizu.send_message.provider", "table/#", 1);
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection,
@Nullable String selection, @Nullable String[] selectionArgs,
@Nullable String sortOrder) {
Log.d("TAG", "query: " + String.valueOf(uriMatcher.match(uri)));
switch (uriMatcher.match(uri)){
case 0:
// 查询table1的所有数据
return db.query(tableName, projection, selection, selectionArgs, null, null, sortOrder);
case 1:
// 查询单条数据
String id = uri.getPathSegments().get(1);
return db.query(tableName, projection, "id = ?", new String[]{id}, null, null, sortOrder);
}
return null;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
if(uriMatcher.match(uri) == 1){
return "vnd.android.cursor.item/vnd.com.weizu.send_message.provider.table";
}
return "vnd.android.cursor.dir/vnd.com.weizu.send_message.provider.table";
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
long insert = db.insert(tableName, null, values);
return Uri.parse("content://com.weizu.send_message.provider/table/"+insert);
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection,
@Nullable String[] selectionArgs) {
if(uriMatcher.match(uri) == 0){
return db.delete(tableName, selection, selectionArgs);
}
String bookId = uri.getPathSegments().get(1);
return db.delete(tableName, "id = ?", new String[]{bookId});
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values,
@Nullable String selection,
@Nullable String[] selectionArgs) {
if(uriMatcher.match(uri) == 0){
return db.update(tableName, values, selection, selectionArgs);
}
String bookId = uri.getPathSegments().get(1);
return db.update(tableName, values, "id = ?", new String