Android四大组件之一ContentProvider 的详细讲解及使用

                            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将内容提供给我们。

         


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值