Android学习笔记-----------内容提供者

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android学习笔记-----------内容提供者相关的知识,希望对你有一定的参考价值。

android学习笔记-----------内容提供者

简介

内容提供者主要用于在不同的程序之间实现数据共享的功能;
一个程序想要访问其他程序种由内容提供者提供的数据,必须依赖于contentresolver这个类的实例,可以通过getContentResolver()这个方法来获取这个类的实例;
这个类提供有query(),insert(),update(),delete()等方法来操作数据
这些方法都需要提供个Uri类型的参数,这个Uri对应的就是你需要操作的数据引用.
一个uri主要由以以下几个部分组成:

content://com.example.myprovider.provider/student/1

scheme: content://

authority: com.example.myprovider.provider

权限表示代表你需要访问的是哪个内容提供者

path: /student/1

路径代表的是你需要访问的表明为student中的id为1的字段
如果需要的是student中所有的数据,则path可以写成/student

 

为其他程序提供一个自己的内容提供者

1.创建一个类,使其继承ContentProvider

2.实现其方法

  • public boolean onCreate() {
      }
  • public Cursor query(Uri uri, String[] projection, String selection,
      String[] selectionArgs, String sortOrder) {
      return null;
      }
  • public String getType(Uri uri) {
      return null;
      }
  • public Uri insert(Uri uri, ContentValues values) {
      return null;
      }
  • public int delete(Uri uri, String selection, String[] selectionArgs) {
      return 0;
      }
  • public int update(Uri uri, ContentValues values, String selection,
      String[] selectionArgs) {
      return 0;
      }

3.在清单文件中注册内容提供者

1 <!-- 需要设置exported属性为true,否则其他程序访问时会出现权限问题-->
2         <provider 
3             android:name="com.example.myprovider.provider.MyProvider"
4             android:authorities="com.example.myprovider.provider"
5             android:exported="true"
6             ></provider>

其他说明会在具体代码中说明:

  1 public class MyProvider extends ContentProvider {
  2     public static final int STUDENT_DIR = 0;
  3     public static final int STUDENT_ITEM = 1;
  4     public static final String AUTHORITY = "com.sjj.myprovider.provider";
  5     private static MyOpenHelper openHelper;
  6     private static UriMatcher uriMatcher;
  7     //通过静态代码块初始化
  8     static {
  9         // UriMatcher.NO_MATCH表示不匹配任何路径的返回码 = -1
 10         uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
 11         uriMatcher.addURI(AUTHORITY, "student", STUDENT_DIR);// 查全部
 12         // #是通配符,表示任意数字
 13         uriMatcher.addURI(AUTHORITY, "student/#", STUDENT_ITEM);// 查某一列
 14     }
 15 
 16     @Override
 17     public boolean onCreate() {
 18         // 在oncreate方法里面创建或者拿到数据库对象
 19         openHelper = new MyOpenHelper(getContext());
 20         return false;
 21     }
 22     /**
 23      * 查询数据的方法
 24      */
 25     @Override
 26     public Cursor query(Uri uri, String[] projection, String selection,
 27             String[] selectionArgs, String sortOrder) {
 28         SQLiteDatabase db = openHelper.getReadableDatabase();
 29         Cursor cursor = null;
 30         //使用uriMatcher.match()方法来匹配uri
 31         switch (uriMatcher.match(uri)) {
 32         case STUDENT_DIR:
 33             cursor = db.query("student", projection, selection, selectionArgs,
 34                     null, null, sortOrder);
 35             break;
 36         case STUDENT_ITEM:
 37             // uri.getPathSegments().get(1)依次提取出PATH的各个部分的字符串,以"/"为标记,以字符串数组的形式输出。
 38             String sid = uri.getPathSegments().get(1);
 39             cursor = db.query("student", projection, "sid = ?",
 40                     new String[] { sid }, null, null, sortOrder);
 41             break;
 42         default:
 43                 
 44             break;
 45         }
 46         return cursor;
 47     }
 48     /**
 49      * 添加数据的方法
 50      */
 51     @Override
 52     public Uri insert(Uri uri, ContentValues values) {
 53         SQLiteDatabase db = openHelper.getWritableDatabase();
 54         Uri returnUri = null;
 55         switch (uriMatcher.match(uri)) {
 56         case STUDENT_DIR:
 57         case STUDENT_ITEM:
 58             long newStudentId = db.insert("student", null, values);
 59             returnUri = Uri.parse("content://" + AUTHORITY + "/student/"
 60                     + newStudentId);
 61             break;
 62         default:
 63             break;
 64         }
 65         return returnUri;
 66     }
 67     
 68     /**
 69      * 删除数据的方法
 70      */
 71     @Override
 72     public int delete(Uri uri, String selection, String[] selectionArgs) {
 73         SQLiteDatabase db = openHelper.getWritableDatabase();
 74         int deleteNum = 0;
 75         switch (uriMatcher.match(uri)) {
 76         case STUDENT_DIR:
 77             deleteNum = db.delete("student", selection, selectionArgs);
 78             break;
 79         case STUDENT_ITEM:
 80             String sid = uri.getPathSegments().get(1);
 81             deleteNum = db.delete("student", "sid = ?", new String[] { sid });
 82             break;
 83         default:
 84             break;
 85         }
 86         return deleteNum;
 87     }
 88     
 89     /**
 90      * 修改数据的方法
 91      */
 92     @Override
 93     public int update(Uri uri, ContentValues values, String selection,
 94             String[] selectionArgs) {
 95         SQLiteDatabase db = openHelper.getWritableDatabase();
 96         int updateNum = 0;
 97         switch (uriMatcher.match(uri)) {
 98         case STUDENT_DIR:
 99             updateNum = db.update("student", values, selection, selectionArgs);
100             break;
101         case STUDENT_ITEM:
102             String sid = uri.getPathSegments().get(1);
103             updateNum = db.update("student", values, "sid = ?",
104                     new String[] { sid });
105             break;
106         default:
107             break;
108         }
109         return updateNum;
110     }
111     
112     /*
113      *gettype()是所有内容提供者都必须提供的一个方法,用于获取对象所对应的MIME类型.一个内容
114      *URI所对应的MIME所对应的MIME字符创主要由三个部分组成.android对他们做了以下要求:
115      *1.必须以vnd开头
116      *2.如果内容URI以路径结尾,则后接android.cursor.dir/,如果内容URI以ID结尾,则后android.cursor.item/
117      *3.最后跟上上vnd.authority.path*/
118     @Override
119     public String getType(Uri uri) {
120         String stringType = null;
121         switch (uriMatcher.match(uri)) {
122         case STUDENT_DIR:
123             stringType = "vnd.android.cursor.dir/vnd."+AUTHORITY+".student";            break;
124         case STUDENT_ITEM:
125             stringType = "vnd.android.cursor.item/vnd."+AUTHORITY+".srudent";
126             break;
127         default:
128             break;
129         }
130         return stringType;
131     }

其他程序如何调用内容提供者

1 //添加操作
2             uri = Uri.parse("content://com.sjj.myprovider.provider/student");
3             ContentValues values = new ContentValues();
4             values.put("sname", "张三");
5             //获取ContentResolve对象并执行indsert方法
6             Uri uri1 =  getContentResolver().insert(uri, values);
7             String insertid  = uri1.getPathSegments().get(1);
 1 //查询操作
 2             uri = Uri.parse("content://com.sjj.myprovider.provider/student");
 3             //获取ContentResolve对象并执行query方法
 4             Cursor cursor = getContentResolver().query(uri, null, null, null, null, null);
 5             if(cursor != null){
 6                 while(cursor.moveToNext()){
 7                     String sname = cursor.getString(cursor.getColumnIndex("sname"));
 8                     Log.i("MainActivity", "sname------"+sname);
 9                 }
10             }

 

以上是关于Android学习笔记-----------内容提供者的主要内容,如果未能解决你的问题,请参考以下文章

安全牛学习笔记提权

安全牛学习笔记利用配置不当提权

Android学习笔记——创建一个简单的上下文菜单ContextMenu

PHP学习笔记

Android学习笔记 Intent

Android学习笔记(32):通知推送Notification