一、provider的使用
1、数据库
private static DBHelper dbHelper;
public DBHelper(@Nullable Context context) {
super(context, "student.db", null, 1);
Log.e("TAG","DBHelper");
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.e("TAG","DBHelper onCreate");
db.execSQL("create table person(_id integer primary key autoincrement,name varchar)");
db.execSQL("insert into person (name) values ('zhangsan')");
}
public static DBHelper getInstance(Context context){
if (dbHelper == null){
dbHelper = new DBHelper(context);
}
return dbHelper;
}
二、继承实现ContentProvider类
首先需要在此module中的manifest.xml文件中添加对外的访问
<provider
android:authorities="com.example.contentproviderdemo1.personprovider"
android:name="com.example.contentproviderdemo1.PersonProvider"
android:exported="true">
</provider>
然后是provider子类
//存放合法uri的容器
private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
private DBHelper dbHelper;
//存入一些合法uri
//content://com.example.contentproviderdemo1.personprovider/person
static {
matcher.addURI("com.example.contentproviderdemo1.personprovider","/person",1);
matcher.addURI("com.example.contentproviderdemo1.personprovider","/person/#",2);
}
public PersonProvider() {
Log.e("TAG","PersonProvider()");
}
@Override
public boolean onCreate() {
Log.e("TAG","PersonProvider() onCreate");
dbHelper = DBHelper.getInstance(this.getContext());
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
Log.e("TAG","PersonProvider() query");
SQLiteDatabase read = dbHelper.getReadableDatabase();
//1、匹配uri,返回code
int code = matcher.match(uri);
Cursor cursor;
//判断
if (code == 1){
//不根据id查询
System.out.println("code == 1");
cursor = read.query("person", projection, selection, selectionArgs, null, null, null);
}else if (code == 2){
//根据id查询
//获取id
System.out.println("code == 2");
long id = ContentUris.parseId(uri);
cursor = read.query(
"person", projection, "_id=?", new String[]{id + ""}, null, null, null);
}else {
//不合法抛出异常
throw new RuntimeException("uri不合法!");
}
return cursor;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
Log.e("TAG","PersonProvider() insert");
SQLiteDatabase db = dbHelper.getWritableDatabase();
int code = matcher.match(uri);
if (code == 1){
long id = db.insert("person", null, values);
//添加插入之后的新的id返回
uri = ContentUris.withAppendedId(uri,id);
return uri;
}else {
throw new RuntimeException("uri不合法");
}
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
Log.e("TAG","PersonProvider() delete");
//根据id或name删除
SQLiteDatabase db = dbHelper.getWritableDatabase();
int deleteCount = -1;
int code = matcher.match(uri);
if (code == 1){
//code==1根据name删除
deleteCount = db.delete("person", selection, selectionArgs);
}else if (code == 2){
long deleteId = ContentUris.parseId(uri);
deleteCount = db.delete("person","_id="+deleteId,null);
}else {
throw new RuntimeException("不合法");
}
return deleteCount;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
Log.e("TAG","PersonProvider() update");
SQLiteDatabase db = dbHelper.getWritableDatabase();
int updateCount;
int code = matcher.match(uri);
if (code == 1){
updateCount = db.update("person", values, selection, selectionArgs);
return updateCount;
}else if (code == 2){
long updateId = ContentUris.parseId(uri);
updateCount = db.update("person",values,"_id="+updateId,selectionArgs);
return updateCount;
}else {
throw new RuntimeException("不合法");
}
}
二、ContentResolver实现并使用
public void insert(View view) {
Log.e("TAG","contentresolverdemo1 insert");
ContentResolver resolver = getContentResolver();
//调用query方法查询
Uri uri = null;
uri = Uri.parse("content://com.example.contentproviderdemo1.personprovider/person");
ContentValues contentValues = new ContentValues();
contentValues.put("name","lisi");
Uri newUri = resolver.insert(uri, contentValues);
Toast.makeText(this,"newUri="+newUri.toString(),Toast.LENGTH_LONG).show();
System.out.println("newUri="+newUri.toString());
}
public void delete(View view) {
Log.e("TAG","contentresolverdemo1 delete");
ContentResolver resolver = getContentResolver();
//调用query方法查询
Uri uri = null;
uri = Uri.parse("content://com.example.contentproviderdemo1.personprovider/person/2");
int deleteCount = resolver.delete(uri, null, null);
Toast.makeText(this,"deleteCount="+deleteCount,Toast.LENGTH_LONG);
System.out.println("deleteCount="+deleteCount);
}
public void query(View view) {
Log.e("TAG","contentresolverdemo1 query");
//得到contentresolver对象
ContentResolver resolver = getContentResolver();
//调用query方法查询
Uri uri = null;
uri = Uri.parse("content://com.example.contentproviderdemo1.personprovider/person");
System.out.println("uri====="+(uri == null));
Cursor cursor = resolver.query(uri, null, null, null, null);
//取出cursor中数据并显示
while (cursor.moveToNext()){
Log.e("TAG","query()");
int id = cursor.getInt(0);
String name = cursor.getString(1);
Toast.makeText(this,id+":"+name,Toast.LENGTH_LONG).show();
System.out.println(id+":"+name);
}
}
public void update(View view) {
Log.e("TAG","contentresolverdemo1 update");
ContentResolver resolver = getContentResolver();
//调用query方法查询
Uri uri = null;
uri = Uri.parse("content://com.example.contentproviderdemo1.personprovider/person/2");
ContentValues contentValues = new ContentValues();
contentValues.put("name","lisi222");
int updateCount = resolver.update(uri, contentValues, null, null);
Toast.makeText(this,"update="+updateCount,Toast.LENGTH_LONG);
System.out.println("update="+updateCount);
}