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 }