布局文件不需要改
MainActivity.java
package com.example.ch08providerdemo;
import androidx.appcompat.app.AppCompatActivity;
import android.net.Uri;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册ContentObserver
getContentResolver().registerContentObserver(
Uri.parse("content://" + MyStar.AUTHORITY),
true,
new MyObserver(null)
);
}
}
MyObserver.java
package com.example.ch08providerdemo;
import android.database.ContentObserver;
import android.os.Handler;
import android.util.Log;
public class MyObserver extends ContentObserver {
public MyObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
// if(selfChange){
Log.i("lww", "数据发生变化");
// }
}
}
MySqliteHelper.java
package com.example.ch08providerdemo;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class MySqliteHelper extends SQLiteOpenHelper {
public MySqliteHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//第一次使用时创建数据库表
String table = "create table StarTB(id integer primary key autoincrement, name varchar(10), hobby varchar(50))";
sqLiteDatabase.execSQL(table);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
MyStar.java
package com.example.ch08providerdemo;
import android.net.Uri;
import android.provider.BaseColumns;
/**
* 用于定义数据表的结构的Java Bean
*/
public final class MyStar {
//定义Authority
public static final String AUTHORITY = "net.onest.lww.provider";
//定义内部表结构(列名)
public static final class MyStarTable implements BaseColumns{
//定义数据表的列名称
public final static String _ID = "id";
public final static String NAME = "name";
public final static String HOBBY = "hobby";
//定义2个Uri
public final static Uri STARS_CONTENT_URI =
Uri.parse("content://" + AUTHORITY + "/stars");
public final static Uri STAR_CONTENT_URI =
Uri.parse("content://" + AUTHORITY + "/star/#");
}
}
MyStarProvider.java
package com.example.ch08providerdemo;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;
public class MyStarProvider extends ContentProvider {
//定义UriMatcher属性
private static UriMatcher matcher =
new UriMatcher(UriMatcher.NO_MATCH);
//定义数据库管理类的对象属性
private MySqliteHelper dbHelper;
//定义2个标号
private static final int STARS = 1;
private static final int STAR = 2;
//注册2个Uri,并关联Uri与标号
static{
matcher.addURI(MyStar.AUTHORITY, "stars", STARS);
matcher.addURI(MyStar.AUTHORITY, "star/#", STAR);
}
public MyStarProvider() {
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int n = 0;
//获取可写的数据库对象
SQLiteDatabase db = dbHelper.getWritableDatabase();
switch (matcher.match(uri)){
case STARS:
n = db.delete(
"StarTB", selection, selectionArgs);
break;
case STAR:
//获取资源id
long id = ContentUris.parseId(uri);
Log.i("lww", "待删除的id:" + id);
//重新拼接where条件
String where = "id = " + id;
if(null != selection && !"".equals(selection)) {
where = where + " and " + selection;
}
//执行更新
n = db.delete(
"StarTB", where, selectionArgs);
break;
default:
throw new UnsupportedOperationException("Not yet implemented");
}
if(n > 0){
//通知数据改变
getContext().getContentResolver().notifyChange(uri, null);
}
return n;
}
@Override
public String getType(Uri uri) {
String type = null;
//根据参数的形式(批量/单一操作)来返回相应的MIME类型
switch (matcher.match(uri)){
case STARS://批量操作数据
type = "lww.cursor.dir/net.onest.lww.provider";
break;
case STAR://单一操作数据
type = "lww.cursor.item/net.onest.lww.provider";
break;
default:
throw new UnsupportedOperationException("Not yet implemented");
}
return type;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
//实现插入数据操作
switch (matcher.match(uri)){
// case STAR:
case STARS:
//获取可写的数据库对象
SQLiteDatabase db = dbHelper.getWritableDatabase();
//执行插入操作
long rowId = db.insert(
"StarTB", null, values);
if(rowId > 0){
//插入成功,通知数据改变
//通知数据改变
getContext().getContentResolver().notifyChange(uri, null);
// 拼接Uri和被插入数据的id
return ContentUris.withAppendedId(uri, rowId);
}else{
//插入失败
return null;
}
default:
throw new UnsupportedOperationException("Not yet implemented");
}
}
@Override
public boolean onCreate() {
dbHelper = new MySqliteHelper(
getContext(),"StarsDB.db",
null, 1);
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor cursor = null;
//获取可读的数据库对象
SQLiteDatabase db = dbHelper.getReadableDatabase();
switch (matcher.match(uri)){
case STARS://批量查询操作
//执行查询操作
cursor = db.query(
"StarTB", projection,
selection, selectionArgs,
null, null,
sortOrder);
break;
case STAR://单一查询操作 。。。。。。。/../3
//解析uri中的id
long id = ContentUris.parseId(uri);
//重新拼接where条件
String where = "id = " + id;
if(null != selection && !"".equals(selection)) {
where = where + " and " + selection;
}
//获取数据库执行查询操作
cursor = db.query(
"StarDB", projection,
where, selectionArgs, null,
null, sortOrder);
break;
default:
throw new UnsupportedOperationException("Not yet implemented");
}
return cursor;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int n = 0;
//获取可写的数据库对象
SQLiteDatabase db = dbHelper.getWritableDatabase();
switch (matcher.match(uri)){
case STARS:
n = db.update(
"StarTB", values, selection, selectionArgs);
break;
case STAR:
//获取资源id
long id = ContentUris.parseId(uri);
String where = "id = " + id;
if(null != selection && !"".equals(selection)) {
where = where + " and " + selection;
}
//执行更新
n = db.update(
"StarTB", values, where, selectionArgs);
break;
default:
throw new UnsupportedOperationException("Not yet implemented");
}
if(n > 0){
//通知数据改变
getContext().getContentResolver().notifyChange(uri, null);
}
return n;
}
}