Android 中的 ContentProvider

Android 中的四大组件中 有 ContentProvider,其作用是对数据增删改查,基本上使用时都是要

  1. 继承这个类 实现 query insert delete update
  2. 将 Provider 注册到 AndroidManifest 之中
  3. 使用 ContentResolver 进行简单的操作, 如:
    String getName(String id) {
       cr = context.getContentResolver();
       uri = Uri.parse("content://com.android.helloworld/" + id);
       Cursor cursor = cr.query(uri, null, null, null);
       if (cursor != null) {
             int nameIndex = cursor.getColumnIndex("Name");
             if(cursor.moveToNext()) {
             return cursor.getString(nameIndex);
             }
       }
    }
    

在 ContentProvider 中, 则为:

private Map<String, String> nameCache;
public Cursor query(String callingPkg, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    MatrixCursor cursor = new MatrixCursor(new String[] {  "id", "Name" });
    List<String> segments = uri.getPathSegments();
    if (segments.size() != 3) { //此处忽略
        String id = segments.get(2);
        String name = nameCache.get(id);
        RowBuilder row = cursor.newRow();
        row.add("id", id);
        row.add("Name", name);
    }
    return cursor;
}

上面的代码 “Name”最好写成一个static final, 或者是有一个类专门做build的。有兴趣可以看一下 DocumentsContract DocumentsProvider.
其实 看到这里 你也知道了:
1. uri 真的是可以随便写,你想写成

content://com.android.helloworld/id=XX

也行, 关键是看你在相关方法中怎么处理这个 id=XX
2. 所谓的将增删改查的操作 与 物理存储分离:
不知道怎么讲 意会一下吧,Provicer 的 query 具体做什么操作 去哪里读数据 都是我们可以控制,也就是不直接操作数据库 文件等等。
3. 返回的 Cursor 行 列 都是可以由我们控制的,实际上用的时候 操作起来像数据库操作,这也间接导致 2)

待补充。
有兴趣的 可以实现一下 sql 中的 like,desc 等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值