(3)【核心】新建类PersonContentProvider,继承ContetProvider
PersonContentProvider.java:
1 package com.example.contentprovidertest01; 2 3 import com.example.contentprovidertest01.dao.PersonDao; 4 5 import android.content.ContentProvider; 6 import android.content.ContentUris; 7 import android.content.ContentValues; 8 import android.content.UriMatcher; 9 import android.database.Cursor; 10 import android.net.Uri; 11 import android.os.Bundle; 12 import android.util.Log; 13 14 public class PersonContentProvider extends ContentProvider { 15 16 private final String TAG = "PersonContentProvider"; 17 private PersonDao personDao = null; 18 private static final UriMatcher URI_MATCHER = new UriMatcher( 19 UriMatcher.NO_MATCH);// 默认的规则是不匹配的 20 private static final int PERSON = 1; // 操作单行记录 21 private static final int PERSONS = 2; // 操作多行记录 22 // 往UriMatcher中添加匹配规则。注意,这里面的url不要写错了,我就是因为写错了,半天没调试出来。哎··· 23 static { 24 // 添加两个URI筛选 25 URI_MATCHER.addURI("com.example.contentprovidertest01.PersonContentProvider", 26 "person", PERSONS); 27 // 使用通配符#,匹配任意数字 28 URI_MATCHER.addURI("com.example.contentprovidertest01.PersonContentProvider", 29 "person/#", PERSON); 30 } 31 32 public PersonContentProvider() { 33 34 } 35 36 @Override 37 public boolean onCreate() { 38 // 初始化一个数据持久层 39 personDao = new PersonDao(getContext()); 40 //Log.i(TAG, "--->>onCreate()被调用"); 41 return true; 42 } 43 44 @Override 45 public Uri insert(Uri uri, ContentValues values) { 46 Uri resultUri = null; 47 // 解析Uri,返回Code 48 int flag = URI_MATCHER.match(uri); 49 switch (flag) { 50 case PERSONS: 51 //调用数据库的访问方法 52 long id = personDao.insertPerson(values); //执行插入操作的方法,返回插入当前行的行号 53 resultUri = ContentUris.withAppendedId(uri, id); 54 Log.i(TAG,"--->>插入成功, id=" + id); 55 Log.i(TAG,"--->>插入成功, resultUri=" + resultUri.toString()); 56 System.out.println("insert success"); 57 break; 58 } 59 return resultUri; 60 } 61 62 //方法:删除记录。注:参数:selection和selectionArgs是查询的条件,是由外部(另一个应用程序)传进来的 63 @Override 64 public int delete(Uri uri, String selection, String[] selectionArgs) { 65 int count = -1; 66 try { 67 int flag = URI_MATCHER.match(uri); 68 switch (flag) { 69 case PERSON: 70 // delete from student where id=? 71 // 单条数据,使用ContentUris工具类解析出结尾的Id 72 long id = ContentUris.parseId(uri); 73 String where_value = "id = ?"; 74 String[] args = { String.valueOf(id) }; 75 count = personDao.deletePerson(where_value, args); 76 break; 77 case PERSONS: 78 count = personDao.deletePerson(selection, selectionArgs); 79 break; 80 } 81 } catch (Exception e) { 82 e.printStackTrace(); 83 } 84 Log.i(TAG, "--->>删除成功,count=" + count); 85 return count; 86 } 87 88 @Override 89 public int update(Uri uri, ContentValues values, String selection, 90 String[] selectionArgs) { 91 int count = -1; 92 try { 93 int flag = URI_MATCHER.match(uri); 94 switch (flag) { 95 case PERSON: 96 long id = ContentUris.parseId(uri); 97 String where_value = " id = ?"; 98 String[] args = { String.valueOf(id) }; 99 count = personDao.updatePerson(values, where_value, args); 100 break; 101 case PERSONS: 102 count = personDao 103 .updatePerson(values, selection, selectionArgs); 104 break; 105 } 106 } catch (Exception e) { 107 e.printStackTrace(); 108 } 109 Log.i(TAG, "--->>更新成功,count=" + count); 110 return count; 111 } 112 113 @Override 114 public Cursor query(Uri uri, String[] projection, String selection, 115 String[] selectionArgs, String sortOrder) { 116 Cursor cursor = null; 117 try { 118 int flag = URI_MATCHER.match(uri); 119 switch (flag) { 120 case PERSON: 121 long id = ContentUris.parseId(uri); 122 String where_value = " id = ?"; 123 String[] args = { String.valueOf(id) }; 124 cursor = personDao.queryPersons(where_value, args); 125 break; 126 case PERSONS: 127 cursor = personDao.queryPersons(selection, selectionArgs); 128 break; 129 } 130 } catch (Exception e) { 131 e.printStackTrace(); 132 } 133 Log.i(TAG, "--->>查询成功,Count=" + cursor.getCount()); 134 return cursor; 135 } 136 137 @Override 138 public String getType(Uri uri) { 139 int flag = URI_MATCHER.match(uri); 140 switch (flag) { 141 case PERSON: 142 return "vnd.android.cursor.item/person"; // 如果是单条记录,则为vnd.android.cursor.item/ 143 // + path 144 145 case PERSONS: 146 return "vnd.android.cursor.dir/persons"; // 如果是多条记录,则为vnd.android.cursor.dir/ 147 // + path 148 } 149 return null; 150 } 151 152 @Override 153 public Bundle call(String method, String arg, Bundle extras) { 154 Log.i(TAG, "--->>" + method); 155 Bundle bundle = new Bundle(); 156 bundle.putString("returnCall", "call被执行了"); 157 return bundle; 158 } 159 }
18行的UriMatcher类的作用是:匹配内容uri,默认的规则是不匹配的。UriMatcher提供了一个addURI方法:
- void android.content.UriMatcher.addURI(String authority, String path, int code)
这三个参数分别代表:权限、路径、和一个自定义代码。一般第一个参数是uri(包名.内容提供者的类名),第二个参数一般是数据库的表名。
27行:匹配规则的解释:*表示匹配任意字符,#表示匹配任意数字。注:如果内部的匹配规则越多,越容易访问。
138行的getType(Uri uri)方法:所有的内容提供者都必须提供的一个方法。用于获取uri对象所对应的MIME类型。
然后,每编写一个内容提供者,都必须在清单文件中进行声明。在AndroidManifest.xml中<application>节点中增加,格式如下:
<provider android:name=".内容提供者的类名" android:authorities="包名.内容提供者的类名" > </provider>
第3行表示的是uri路径,毕竟Contet Provider是通过路径来访问的。
所以在本程序中,在AndroidManifest.xml的<application>节点中增加如下代码:
<provider android:name=".PersonContentProvider" android:authorities="com.example.contentprovidertest01.PersonContentProvider" > </provider>