Android四大组件之一ContentProvider 的详细讲解及使用
2016-07-10 01:55
447 查看
Android四大组件之一ContentProvider 的使用
ContentProvider在安卓开发中占着重要的比例,是安卓开发中四大组建之一。什么是ContentProvider?
ContentProvider 是内容提供者,简单的说 就是我们把数据存储起来和获取数据的统一接口,就是他给你提供内容 即数据。为什么说理解成数据源呢? 最常见的就是数据库
为一个数据源,ContentProvider 将对数据源进行操作,我们对ContentProvider 进行操作,可以大概这么理解,在后面的示例中,也是用数据库作为数据源,ContentProvider 操作student这张表。
如何从ContentProvider 中提取数据?
ContentProvider 中提供了以下对数据的操作方式:
1.插入数据 insert
2.查询 query
3.删除 deleted
4.更新 updata
5.获得类型 getType
URI与ContentProvider 的关系,以及关联?
每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的 ContentProvider 都存放在android.provider包当中
如何操作URI中的数据?
Uri代表要操作的数据,我们经常要去解析Uri的数据,并且从中获取数据,Android开发为我们提供了一个解析工具 UriMatcher 。
掌握它的使用,会给我们开发带来很大的方便。
注册路径:
//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
UriMatcher sMatcher = new
UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://cn.xxt.provider.personprovider/student路径,返回匹配码为1
第一个路径: sMatcher.addURI(“cn.xxt.provider.personprovider”, “person”, 1);//添加需要匹配uri,如果匹配就会返回匹配码
//如果match()方法匹配content://cn.xxt.provider.personprovider/student/#路径,返回匹配码为2
第二个路径: sMatcher.addURI(“cn.xxt.provider.personprovider”, “person/#”, 2);//#号为通配符
switch (sMatcher.match(Uri.parse("content://cn.xxt.provider.personprovider/person/10")))
{
case 1: //匹配第一个路径
根据addurl 方法中的第三个参数的 匹配码确定
break;
case 2: //匹配第二个路径
break;
default://不匹配
break;
}
注册完需要匹配的Uri后,就可以使用match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content://cn.xxt.provider.personprovider/student路径,返回的匹配码为1,content://cn.xxt.provider.personprovider/student/#
路径 返回的匹配码为2,这样就完成了对UriMatcher
理解和使用。
示例代码:
private final static UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
private final static int STUDENT = 1;
private final static int STUDENTS = 2;
static
{
URI_MATCHER.addURI("com.example.loadermanagerdemo.StudentContentProvider", "student", STUDENTS);
URI_MATCHER.addURI("com.example.loadermanagerdemo.StudentContentProvider", "student/#", STUDENT);
}
ContentProvider的方法如何使用?
onCreate()初始化功能 比如:数据库的初始化。
getType(Uri uri) 获取匹配的类型 示例代码如下:
@Override
public String getType(Uri uri)
{
// 匹配路径的类型
int flag = URI_MATCHER.match(u ri);
switch (flag)
{
case STUDENT:
return "vnd.android.cursor.item/student";
case STUDENTS:
return "vnd.android.cursor.dir/students";
}
return null;
}
return 后面的一大串字符串在API中给出 如果是一个操作就返回
<span style="background-color: rgb(255, 255, 255);"><span style="color:#663300;"> "vnd.android.cursor.item/student",否则 返回</span></span><pre name="code" class="java" style="font-size: 16px; line-height: 24px;"><span style="background-color: rgb(255, 255, 255);"><span style="color:#663300;"> "vnd.android.cursor.dir/students"</span></span>
到达这里了 接下来只剩下对数据的一些基本操作:
在这里至贴出示例代码以及解释:
查询:
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
{
Cursor cursor = null;
int flag = URI_MATCHER.match(uri);
SQLiteDatabase database=dbHelper.getWritableDatabase();
switch (flag)
{
case STUDENT:
long stuid = ContentUris.parseId(uri);
String where_value = "stuid = " + stuid;
if (selection!=null && !selection.equals(""))
{
where_value+=selection;
}
cursor=database.query("student", projection, where_value, selectionArgs, null, null, null);
break;
case STUDENTS:
cursor=database.query("student", projection, selection, selectionArgs, null, null, null);
break;
}
return cursor;
}
在这里使用到了数据库,在query(1,2,3...); 第一个参数为 一个数据库的表,selection为 选择的条件 selectionArgs为条件参数。
插入:
@Override
public Uri insert(Uri uri, ContentValues values)
{
int flag = URI_MATCHER.match(uri);
SQLiteDatabase database = dbHelper.getWritableDatabase();
Uri tempUri = null;
switch (flag)
{
case STUDENT:
break;
case STUDENTS:
// 返回插入成功后 返回的行数
long id = database.insert("student", null, values);
tempUri = ContentUris.withAppendedId(uri, id);
break;
}
// Log.i("TAG", "-->>"+tempUri.toString());
System.out.println("-->>" + tempUri.toString());
return tempUri;
}
删除:
@Override
public int delete(Uri uri, String selection, String[] selectionArgs)
{
// 影响数据库的
int count = 0;
int flag = URI_MATCHER.match(uri);
SQLiteDatabase database = dbHelper.getWritableDatabase();
switch (flag)
{
case STUDENT:
long stuid = ContentUris.parseId(uri);
String where_value = "stuid = " + stuid;
if (selection != null && !selection.equals(""))
{
where_value += selection;
}
count = database.delete("student", where_value, selectionArgs);
break;
case STUDENTS:
count = database.delete("student", selection, selectionArgs);
break;
}
return count;
}
更新:
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
{
int count = 0;
int flag = URI_MATCHER.match(uri);
SQLiteDatabase database = dbHelper.getWritableDatabase();
switch (flag)
{
case STUDENT:
long stuid = ContentUris.parseId(uri);
String where_value = "stuid = " + stuid;
if (selection != null && !selection.equals(""))
{
where_value += selection;
}
count = database.update("student", values, where_value, selectionArgs);
case STUDENTS:
count = database.update("student", values, selection, selectionArgs);
break;
}
return count;
}
以上才做,都要先用match()方法
匹配到匹配码,然后在进行选择性逻辑操作。这里的数据库为一个数据源,而ContentProvide将内容提供给我们。
相关文章推荐
- Android 抽屉效果的导航菜单实现
- android.support.v4.widget.DrawerLayout 抽屉效果导航菜单
- 【Android】Android Camera实时数据采集及通过MediaCodec硬编码编码数据的流程
- android全局异常捕获器UncaughtExceptionHandler的基本使用
- 【Android】使用MediaCodec硬编码实现视频直播推流端(一)
- 【Android】使用MediaCodec硬编码实现视频直播推流端(一)
- 【Android】使用MediaCodec硬编码实现视频直播推流端(一)
- EasyPusher安卓Android手机直播推送之MediaCodec 硬编码H264格式
- Android Xutils框架使用
- android 属性动画入门
- Android Xutils框架使用之ViewUtils
- Android-命令行打包
- Android Xutils框架使用之DBUtils
- Android Xutils框架使用之BitmapUtils
- [直播一揽子]初期调研
- Android中图片的三层缓存详解
- Android Studio官方文档之用注解检查改善代码质量
- 修改android Toolbar的标题大小和按钮图标颜色
- Android使用intent跳转到其它应用activity界面
- android Fragments详解五:与activity通讯