Android 中的四大组件中 有 ContentProvider,其作用是对数据增删改查,基本上使用时都是要
- 继承这个类 实现 query insert delete update
- 将 Provider 注册到 AndroidManifest 之中
- 使用 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 等等。