Uint7:内容提供器
1.权限
权限分为两种:普通权限和危险权限
普通权限在.xml中进行权限声明
危险权限需要进行运行时处理
// 1.先判断是否有权限
if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
// 没有授权
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);
// 2.requestPermission会开启一个弹出框询问是否开启授权,结果封装到OnRequestPermissionsResult中的getResults参数中
} else {
// 获取授权
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
// 3.重写弹出框选项
@SuppressLint("MissingPermission")
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
} else {
Toast.makeText(this, "你没有获取授权", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
访问现有内容器
须知:
Context.getContentResolver()获取ContentResolver对象,通过
.query(..)
.insert(Uri,ContentValues)
.delete(Uri,Selection,SelectionArgs)
.update(Uri,ContentValues,selection,selectionArgs)
ContentValues values = new ContentValues();
Uri uri = uri.parse("content://com.example.test/table")
查询
// Uri 指定查询某个项目下的某个表
// projection 指定查询的列名
// selection 指定查询的限制条件
// selectionArgs 指定占位符的数据
// orderBy 指定结果的排序
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactList.add(displayName +"\n" + number);
}
adapter.notifyDataSetChanged();
cursor.close();
}
Uri uri = Uri.parse("content://com.example.unit6_3_sqlife.provider/book");
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
System.out.println(name);
}
cursor.close();
}
自定义内容器
public class DatabaseProvider extends ContentProvider {
public static final int BOOK_DIR = 0;
public static final int BOOK_ITEM = 1;
public static final int CATEGORY_DIR = 2;
public static final int CATEGORY_ITEM = 3;
public static final String AUTHORITY = "com.example.unit6_3_sqlife.provider";
private static UriMatcher uriMatcher;
private MydatabaseHelper dbHelper;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY,"book",BOOK_DIR);
uriMatcher.addURI(AUTHORITY,"book/#",BOOK_ITEM);
uriMatcher.addURI(AUTHORITY,"category",CATEGORY_DIR);
uriMatcher.addURI(AUTHORITY,"category/#",CATEGORY_ITEM);
}
/**
* 初始化新建一个数据库
* @return
*/
@Override
public boolean onCreate() {
dbHelper = new MydatabaseHelper(getContext(), "BookStore,db", null, 2);
return true;
}
/**
* 将Uri转变成对应的类型
* @param uri
* @return
*/
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)) {
case BOOK_DIR:
return "vnd.android.cursor.dir/vnd.com.example.unit6_3_sqlife.provider.book";
case BOOK_ITEM:
return "vnd.android.cursor.item/vnd.com.example.unit6_3_sqlife.provider.book";
case CATEGORY_DIR:
return "vnd.android.cursor.dir/vnd.com.example.unit6_3_sqlife.provider.category";
case CATEGORY_ITEM:
return "vnd.android.cursor.item/vnd.com.example.unit6_3_sqlife.provider.category";
}
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Uri uriReturn = null;
switch (uriMatcher.match(uri)) {
case BOOK_DIR:
case BOOK_ITEM:
long newBookId = db.insert("Book", null, values);
uriReturn = Uri.parse("content://" + AUTHORITY + "/book/" + newBookId);
break;
case CATEGORY_DIR:
case CATEGORY_ITEM:
long newCategoryId = db.insert("Category", null, values);
uriReturn = Uri.parse("content://" + AUTHORITY + "/category" + newCategoryId);
break;
default:
break;
}
return uriReturn;
}
@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;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// TODO: Implement this to handle query requests from clients.
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = null;
switch (uriMatcher.match(uri)) {
case BOOK_DIR:
cursor = db.query("Book", projection, selection, selectionArgs, null, null, sortOrder);
System.out.println("有人查询book了,cursor 是:" + cursor);
break;
case BOOK_ITEM:
String bookId = uri.getPathSegments().get(1);
cursor = db.query("Book", projection, "id = ?", new String[]{ bookId }, null, null, sortOrder);
break;
case CATEGORY_DIR:
cursor = db.query("Category", projection, selection, selectionArgs, null, null, sortOrder);
break;
case CATEGORY_ITEM:
String categoryId = uri.getPathSegments().get(1);
cursor = db.query("Category", projection, "id = ?", new String[]{categoryId}, null, null, sortOrder);
break;
default:
break;
}
return cursor;
}
}
.XML中注册:
<provider
android:name=".DatabaseProvider"
android:authorities="com.example.unit6_3_sqlife.provider"
android:enabled="true"
android:exported="true">
</provider>

浙公网安备 33010602011771号