使用 room 操作 ContentProvider

实际上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 跟平时一样。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值