实际上APP 应用,确实很少用得上 ContentProvider ,,,很多同学一看到 ContentProvider 就头大,主要是操作实在太麻烦。 本文试着使用,Room操作 ContentProvider ,主要是没有做项目,只大概实现功能,没有优化代码。
先manifest 注册一个 ContentProvider :
<provider
android:name=".test5.fragment6.cp.TestProvider"
android:authorities="test2mvvm.testprovider"
android:exported="true" />
如果加权限,则修改代码为:
<permission
android:name="test2mvvm.PROVIDER"
android:protectionLevel="normal" />
<provider
android:name=".test5.fragment6.cp.TestProvider"
android:authorities="test2mvvm.testprovider"
android:permission="test2mvvm.PROVIDER"
android:exported="true" />
写一个 room 实体,就是一张表:
@Entity(tableName = CP_Bean.TABLE_NAME)
public class CP_Bean {
public static final String TABLE_NAME = "user";
public static final String COLUMN_NAME = "name";
public static final String COLUMN_ID = "_id";
@PrimaryKey
int _id;
String name;
public CP_Bean(int _id, String name) {
this._id = _id;
this.name = name;
}
@Override
public String toString() {
return "CP_Bean{" +
"_id=" + _id +
", name='" + name + '\'' +
'}';
}
}
下面 是room 的dao,各种功能操作自己看着添加修改即可。
@Dao
public interface CP_Dao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(CP_Bean... cpBeans);
@Delete
void delete(CP_Bean... cpBeans);
@Query("select * from user")
List<CP_Bean> getAll();
@Query("select * from " + CP_Bean.TABLE_NAME + " where " + CP_Bean.COLUMN_ID + " = :id")
Cursor selectByID(int id);
@Query("select "+CP_Bean.COLUMN_ID+","+CP_Bean.COLUMN_NAME +" from "+CP_Bean.TABLE_NAME)
Cursor selectByColumn();
}
自然少不了 db数据库,CP_AppDatabase
@Database(entities = {CP_Bean.class}, version = 1)
public abstract class CP_AppDatabase extends RoomDatabase {
public abstract CP_Dao cp_dao();
public static CP_AppDatabase creat_database(Context context, String name) {
CP_AppDatabase db = Room.databaseBuilder(context.getApplicationContext(),
CP_AppDatabase.class, "cp.db")
.allowMainThreadQueries()
.build();
return db;
}
}
下面是写一个ContentProvider 供其他进程 操作数据:后期有空的完善一下。这样用room操作,一下子简单很多了。代码也只有区区几行。
public class TestProvider extends ContentProvider {
CP_AppDatabase db;
CP_Dao cp_dao;
@Override
public boolean onCreate() {
Loge.e("onCreate");
db = CP_AppDatabase.creat_database(getContext(), "testA.db");
cp_dao = db.cp_dao();
return true;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
Loge.e("query");
Cursor cursor = cp_dao.selectByColumn();
while (cursor.moveToNext()){
Loge.e(cursor.getString(0)+"====="+cursor.getString(1));
}
return cursor;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
Loge.e("insert");
CP_Bean cp_bean = new CP_Bean((Integer) values.get("_id"), (String) values.get("name"));
cp_dao.insert(cp_bean);
getContext().getContentResolver().notifyChange(uri,null);
return uri;
}
@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;
}
}
最后,我们在fragment引用测试一下:
public class Fragment6_room extends BaseFragment<Test5Fragment5Binding> {
@Override
protected int getLayoutId() {
return R.layout.test5_fragment5;
}
@Override
protected void initView() {
db = CP_AppDatabase.creat_database(getContext(), "fragment6_room.db");
cp_dao = db.cp_dao();
for (int i = 0; i < 3; i++) {
CP_Bean cp_bean = new CP_Bean(i, "bean" + i);
cp_dao.insert(cp_bean);
}
Cursor cursor = cp_dao.selectByID(0);
while (cursor.moveToNext()) {
Loge.e(cursor.getString(0)+"--"+cursor.getString(1));
}
// Loge.e(cp_dao.selectByID(0).toString());
}
CP_Dao cp_dao;
CP_AppDatabase db;
@Override
protected void initData() {
Loge.e("test");
// 设置URI
Uri uri_user = Uri.parse("content://test2mvvm.testprovider/user");
// 插入表中数据
ContentValues values = new ContentValues();
values.put("_id", 3);
values.put("name", "Iverson");
// 获取ContentResolver
ContentResolver resolver = getContext().getContentResolver();
// 通过ContentResolver 根据URI 向ContentProvider中插入数据
resolver.insert(uri_user, values);
// 通过ContentResolver 向ContentProvider中查询数据
Cursor cursor = resolver.query(uri_user, null, null, null, null);
while (cursor.moveToNext()) {
Loge.e("query book:" + cursor.getInt(0) + " " + cursor.getString(1));
// 将表中数据全部输出
}
cursor.close();
}
}
非常简单好用,在本进程内操作数据,直接用room即可,跨进程操作数据,就使用ContentResolver 跟平时一样。