笔记——内容提供器

  1. android6.0之后的危险权限

    ![1381514173164_.pic_hd](/Users/zhaoting/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/a017fbcbbfb89943c01d8bbc6ae78abc/Message/MessageTemp/a017fbcbbfb89943c01d8bbc6ae78abc/Image/1381514173164_.pic_hd.jpg)

    • 判断是否有权限的时候,可以不用判断版本,貌似自己就已经进行判断了。

      ACTION_CALL:打电话功能,需要在android 6.0以上申请权限

      ACTION_DIAL:进入拨号键盘功能,即使是android6.0以上也不需要申请

    • 若应用被赋予了某个权限组中的一个权限,那么该组中的其他权限将被自动获取。

  2. 关于内容提供器

    • 内容URI给内容提供器中的数据建立了唯一标识符,它主要由两部分组成:authority和path。authority是用于对不同的应用程序做区分的,一般为了避免冲突,都会采用程序包名的方式来命名。比如某个程序的包名是com.example.app,那么该程序对应的authority就可以命名为com.example.app.provider。path则是用于对同一应用程序中不同的表做区分的,通常都会添加到authority的后面。比如某个程序的数据库里存在两张表:table1和table2,这时就可以将path分别命名为/table1和/table2,然后把authority和path进行组合,内容URI就变成了com.example.app.provider/table和com.example.app.provider/table2。但是内容的URI还需要加上协议声明,因此,内容URI最标准的格式写法为“content://com.example.app.provider/table1”和“content://com.example.app/provider/table2”

    • 查询

      /**
      * uri:指定查询某个应用程序下的某一张表
      * projection:指定查询的列名
      * selection:指定where的约束条件
      * selectionArgs:为where中的占位符提供具体的值
      * orderBy:指定查询结果的排序方式
      **/
      Cursor cursor=getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder);
    • 添加

      /**
      * 使用uri参数来确定要添加到的表,待添加的数据保存在values参数中。添加完成后,返回一个勇于表
      * 示这条新纪录的URI
      **/
      ContentValues values=new ContentValues();
      values.put("column1","text");
      values.put("column2",1);
      getContentResolver().insert(uri,values);
    • 更新

      /**
      * 更新内容提供器中已有的数据,使用uri参数来确定更新哪一张表中的数据,新数据保存在values参数
      * 中,selection和selectionArgs参数用于约束更新哪些行,受影响的行数将作为返回值返回。
      **/
      ContentValues values=new ContentValues();
      values.put("column1","");
      getContentResolver().update(uri,values,"column1=? and column2=?",new String[]{"text","1"});
    • 删除

      /**
      * 从内容提供器中删除数据。使用uri参数来确定删除哪一张表中的数据,selection和selectionArgs参数用于约束删除哪些行,被删除的行数将作为返回值返回。
      **/
      getContentValues().delete(uri,"column2=?",new String[]{"1"});
  3. 创建内容提供器

    public class MyProvider extends ContentProvider {
     /**
     * 初始化内容提供器的时候调用。通常会在这里完成对数据库的创建和升级等操作,返回true表示内容
     * 提供器初始化成功,返回false则表示失败。
     **/
       @Override
       public boolean onCreate() {
           return false;
       }
    
     /**
     * 从内容提供器中查询数据。使用uri参数来确定查询哪张表,projection参数用于确定查询哪些列,selection和selectionArgs参数用于约束查询哪些行,sortOrder参数用于对结果进行排序,查询的结果存放在Cursor对象中返回。
     **/
       @Nullable
       @Override
       public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
           return null;
       }
    
     /**
     * 根据传入的内容URI来返回相应的MIME类型。
     * 是所有的内容提供器都必须提供的一个方法,用于获取Uri对象所对应的MIME类型。
     **/
       @Nullable
       @Override
       public String getType(@NonNull Uri uri) {
           return null;
       }
    
     /**
     * 向内容提供器中添加一条数据。使用uri参数来确定要添加到的表,待添加的数据保存在values参数
     * 中。添加完成后,返回一个用于表示这条新纪录的URI。
     **/
       @Nullable
       @Override
       public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
           return null;
       }
    
     /**
     * 从内容提供器中删除数据。使用uri参数来确定删除哪一张表中的数据,selection和
     * selectionArgs参数用于约束删除哪些行,被删除的行数将作为返回值返回。
     **/
       @Override
       public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
           return 0;
       }
    
     /**
     * 更新内容提供器中已有的数据。使用uri参数来确定更新哪一张表中的数据,新数据保存在values参
     * 数中,selection和selectionArgs参数用于约束更新哪些行,受影响的行数将作为返回值返回。
     **/
       @Override
       public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
           return 0;
       }
    }

  4. 标准的内容URI的写法

    • content://com.example.app.provider/table1

      表示调用方期望访问的是com.example.app这个应用的table1表中的数据。

    • content://com.example.app.provider/table1/id

      表示调用方期望访问的是com.example.app这个应用的table1表中id为1的数据

    • 我们可以使用通配符的方式来分别匹配这两种格式的内容URI,规则如下。

      • “*”:表示匹配任意长度的任意字符

      • “#”:表示匹配任意长度的数字

      • 所以,一个能够匹配任意表的内容URI格式就可以写成

      content://com.example.app.provider/*

      • 一个能够匹配table1表中任意一行数据的内容URI格式就可以写成

      content://com.example.app.provider/table1/#

  5. UriMatcher中提供了一个addURI( )方法,这个方法接收3个参数,可以分别把authority、path和一个自定义代码穿进去。这样,当调用UriMatcher的match( )方法时,就可以将一个Uri对象传入,返回值是某个能够匹配这个Uri对象所对应的自定义代码,利用这个代码,我们就可以判断出调用方期望访问的是哪张表中的数据了。

  6. 一个内容URI所对应的MIME字符串主要由3部分组成,Android对这3个部分做了如下格式规定。

    • 必须以vnd开头
    • 如果内容URI以路径结尾,则后接android.cursor.dir/,如果内容以id结尾,则后接android.cursor.item/。
    • 最后接上vnd..。
    • 所以对于content://com.example.app.provider/table1这个内容URI,它所对应的MIME类型就可以写成:vnd.android.cursor.dir/vnd.com.example.app.provider.table1
    • 对于content://com.example.app.provider/table1/1这个内容URI,它所对应的MIME类型就可以写成:vnd.android.cursor.item/vnd.com.example.app.provider.table1

猜你喜欢

转载自blog.csdn.net/ting1406525501/article/details/78981392