网友通过本文主要向大家介绍了contentprovider,contentprovider详解,contentprovider实例,安卓contentprovider,no content provider等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
使用ContentProvider访问非数据库数据
一般情况我们使用ContentProvider主要访问数据库数据,但有时也可能需要访问非数据库数据,如XML或者本地数据,那就需要做一下特殊处理最主要的是需要自定义Cursor,因为ContentProvider的query方法,只能返回Cursor引用。直接上代码,咱们边看边说
以上是自定义contentProvider,网上有很多例子和说明,不在详述,我们主要看一下query,我返回自定义Cursor。
- public class MyContentProvider extends ContentProvider {
- //操作URI的类
- public static final UriMatcher uriMatcher;
- //为UriMatcher添加自定义的URI
- static{
- uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
- uriMatcher.addURI(ProviderConstant.AUTHORITIES,"/user",
- ProviderConstant.INCOMING_USER_COLLECTION);
- uriMatcher.addURI(ProviderConstant.AUTHORITIES,"/user/#",
- ProviderConstant.INCOMING_USER_SINGLE);
- }
- private HashMap
> allDatas= new HashMap >(); - private MyCursor cursor;
- public MyContentProvider(){
- cursor = new MyCursor();
- loadAllData();
- }
- /**
- * 加载我们的数据信息
- */
- public void loadAllData(){
- allDatas.clear();
- for(int pos=0; pos < 5;pos++){//填充5个学生数据
- ArrayList
dataList = new ArrayList<>(); - dataList.add(pos+"");//id
- dataList.add("name"+pos);//name
- allDatas.put(pos+"",dataList);
- }
- }
- /**
- * 删除数据
- */
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- System.out.println("delete");
- int count = 0;
- String id = getUserId(selection, selectionArgs);
- if(allDatas.containsKey(id)){
- allDatas.remove(id);
- count = 1;
- }
- return count;
- }
- /**
- * 数据库访问类型
- */
- @Override
- public String getType(Uri uri) {
- System.out.println("getType");
- //根据用户请求,得到数据类型
- switch (uriMatcher.match(uri)) {
- case ProviderConstant.INCOMING_USER_COLLECTION:
- return ProviderConstant.CONTENT_TYPE;
- case ProviderConstant.INCOMING_USER_SINGLE:
- return ProviderConstant.CONTENT_TYPE_ITEM;
- default:
- throw new IllegalArgumentException("UnKnown URI"+uri);
- }
- }
- /**
- * 插入数据
- */
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- ArrayList
data = new ArrayList<>(); - int id =values.getAsInteger(ProviderConstant.ID);
- String name = values.getAsString(ProviderConstant.NAME);
- data.add(id+"");
- data.add(name);
- allDatas.put(id+"", data);
- return uri;
- }
- /**
- * 创建ContentProvider时调用的回调函数
- */
- @Override
- public boolean onCreate() {
- System.out.println("onCreate");
- return true;
- }
- /**
- * 查询数据库
- */
- @Override
- public Cursor query(Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder) {
- //判断用户请求,查询所有还是单个
- switch(uriMatcher.match(uri)){
- case ProviderConstant.INCOMING_USER_COLLECTION:
- cursor.updateAllData(allDatas.values());
- break;
- case ProviderConstant.INCOMING_USER_SINGLE:
- String id = uri.getLastPathSegment();
- cursor.updateUserData(allDatas.get(id));
- break;
- }
- return cursor;
- }
- /**
- * 更新数据库
- */
- @Override
- public int update(Uri uri, ContentValues values, String selection,
- String[] selectionArgs) {
- System.out.println("update");
- String id = getUserId(selection, selectionArgs);
- int count=0;
- if(allDatas.containsKey(id)){
- String name = values.getAsString(ProviderConstant.NAME);
- //index取决于name所在的列
- allDatas.get(id).set(cursor.getColumnIndex(ProviderConstant.NAME), name);
- count = 1;
- }
- return count;
- }
- /**
- * 获取关键信息,用户ID
- * @param selection
- * @param selectionArgs
- * @return
- */
- private String getUserId(String selection, String[] selectionArgs){
- if(selectionArgs == null || selectionArgs.length == 0){
- //id 包含在selection里
- return selection.substring(selection.indexOf("=")+1).trim();
- }else{
- return selectionArgs[0];
- }
- }
- }
其中用到了一些常量如下:
- public class ProviderConstant {
- //URI的指定,此处的字符串必须和声明的authorities一致
- public static final String AUTHORITIES = "com.zy.sports.app.MyContentProvider";
- //访问该ContentProvider的URI
- public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITIES + "/user");
- //该ContentProvider所返回的数据类型的定义
- public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.myprovider.user";
- public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.myprovider.user";
- //访问表的所有列
- public static final int INCOMING_USER_COLLECTION = 1;
- //访问单独的列
- public static final int INCOMING_USER_SINGLE = 2;
- public static final String ID = "id";
- public static final String NAME = "name";
- }
自定义Cursor的代码如下:
- public class MyCursor extends AbstractCursor{
- private static final String TAG = "MyCursor";
- private String[] columnNames= null;//构建cursor时必须先传入列明数组以规定列数
- /**
- * 数据区域
- */
- //所有的数据
- private ArrayList> allDatas= new ArrayList>();//在构造的时候填充数据,里层数据的size=columnNames.leng
- //当前一项的数据
- private ArrayList
oneLineData= null;//onMove时填充 - public MyCursor(){
- //必须构建完整列信息
- columnNames = new String[]{"id","name"};
- }
- /**
- * 加载我们的数据信息
- */
- public void updateAllData(Collection> data){
- mPos = -1;
- allDatas.clear();
您可能想查找下面的文章:
- 使用ContentProvider访问非数据库数据
- Android之ContentProvider数据存储,contentprovider
- ContentProvider域名替换小工具,contentprovider域名
- ContentProvider中央档案馆,以及获取联系人电话的示例,contentprovider
- (试笔)一、Android四大框架之ContentProvider的学习与运用,实现SQLite的增删改查。,安卓sqlite增删改查
- Android中ContentProvider组件数据共享
- 安卓第十四天笔记-内容提供者(ContentProvider),contentprovider