您的位置:首页 > 移动开发 > Android开发

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

         

        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: