600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > contentProvider 内容提供者

contentProvider 内容提供者

时间:2020-08-20 07:08:13

相关推荐

contentProvider 内容提供者

/woshixuye/article/details/8280879

实例代码

当数据需要在应用程序间共享时,我们就可以利用ContentProvider为数据定义一个URI。之后其他应用程序对数据进行查询或者修改时,只需要从当前上下文对象获得一个ContentResolver(内容解析器)传入相应的URI就可以了。

contentProvider和Activity一样是Android的组件,故使用前需要在AndroidManifest.xml中注册,必须放在主应用所在包或其子包下。

1 <application android:icon="@drawable/icon" android:label="@string/app_name"> 2<activity android:name=".MainActivity" 3android:label="@string/app_name"> 4<intent-filter> 5 <action android:name="android.intent.action.MAIN" /> 6 <category android:name="android.intent.category.LAUNCHER" /> 7</intent-filter> 8<intent-filter> 9 <data android:mimeType="vnd.android.cursor.dir/person" /> 10</intent-filter> 11<intent-filter> 12 <data android:mimeType="vnd.android.cursor.item/person" /> 13</intent-filter> 14</activity> 15<!-- 配置内容提供者,android:authorities为该内容提供者取名作为在本应用中的唯一标识 --> 16<provider android:name=".providers.PersonProvider" 17 android:authorities="cn.xyCompany.providers.personProvider"/> 18 </application> 19 20 内容提供者和测试代码21

1 package cn.xy.cotentProvider.app.providers; 2 import android.content.ContentProvider; 3 import android.content.ContentUris; 4 import android.content.ContentValues; 5 import android.content.UriMatcher; 6 import android.database.Cursor; 7 import android.database.sqlite.SQLiteDatabase; 8 import .Uri; 9 import android.util.Log; 10 import cn.xy.cotentProvider.service.DBOpeningHelper; 11 12 /** 13 * contentProvider作为一种组件必须放在应用所在包或其子包下,主要作用是对外共享数据 14 * 测试步骤1:将本项目先部署 15 * 测试步骤2:调用测试方法 16 * @author xy 17 * 18 */ 19 public class PersonProvider extends ContentProvider 20 { 21private DBOpeningHelper dbHelper; 22 23// 若不匹配采用UriMatcher.NO_MATCH(-1)返回 24private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH); 25 26// 匹配码 27private static final int CODE_NOPARAM = 1; 28private static final int CODE_PARAM = 2; 29 30static 31{ 32 // 对等待匹配的URI进行匹配操作,必须符合cn.xyCompany.providers.personProvider/person格式 33 // 匹配返回CODE_NOPARAM,不匹配返回-1 34 MATCHER.addURI("cn.xyCompany.providers.personProvider", "person", CODE_NOPARAM); 35 36 // #表示数字 cn.xyCompany.providers.personProvider/person/10 37 // 匹配返回CODE_PARAM,不匹配返回-1 38 MATCHER.addURI("cn.xyCompany.providers.personProvider", "person/#", CODE_PARAM); 39} 40 41@Override 42public boolean onCreate() 43{ 44 dbHelper = new DBOpeningHelper(this.getContext()); 45 return true; 46} 47 48/** 49* 外部应用向本应用插入数据 50*/ 51@Override 52public Uri insert(Uri uri, ContentValues values) 53{ 54 SQLiteDatabase db = dbHelper.getWritableDatabase(); 55 switch (MATCHER.match(uri)) 56 { 57 case CODE_NOPARAM: 58 // 若主键值是自增长的id值则返回值为主键值,否则为行号,但行号并不是RecNo列 59 long id = db.insert("person", "name", values); 60 Uri insertUri = ContentUris.withAppendedId(uri, id); 61 return insertUri; 62 default: 63 throw new IllegalArgumentException("this is unkown uri:" + uri); 64 } 65} 66 67/** 68* 外部应用向本应用删除数据 69*/ 70@Override 71public int delete(Uri uri, String selection, String[] selectionArgs) 72{ 73 SQLiteDatabase db = dbHelper.getWritableDatabase(); 74 switch (MATCHER.match(uri)) 75 { 76 case CODE_NOPARAM: 77 return db.delete("person", selection, selectionArgs); // 删除所有记录 78 case CODE_PARAM: 79 long id = ContentUris.parseId(uri); // 取得跟在URI后面的数字 80 Log.i("provider", String.valueOf(id)); 81 String where = "id = " + id; 82 if (null != selection && !"".equals(selection.trim())) 83 { 84 where += " and " + selection; 85 } 86 return db.delete("person", where, selectionArgs); 87 default: 88 throw new IllegalArgumentException("this is unkown uri:" + uri); 89 } 90} 91 92/** 93* 外部应用向本应用更新数据 94*/ 95@Override 96public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 97{ 98 SQLiteDatabase db = dbHelper.getWritableDatabase(); 99 switch (MATCHER.match(uri)) 100 { 101 case CODE_NOPARAM: 102 return db.update("person",values,selection, selectionArgs); // 更新所有记录 103 case CODE_PARAM: 104 long id = ContentUris.parseId(uri); // 取得跟在URI后面的数字 105 String where = "id = " + id; 106 if (null != selection && !"".equals(selection.trim())) 107 { 108 where += " and " + selection; 109 } 110 return db.update("person",values,where,selectionArgs); 111 default: 112 throw new IllegalArgumentException("this is unkown uri:" + uri); 113 } 114} 115 116/** 117* 返回对应的内容类型 118* 如果返回集合的内容类型,必须以vnd.android.cursor.dir开头 119* 如果是单个元素,必须以vnd.android.cursor.item开头 120*/ 121@Override 122public String getType(Uri uri) 123{ 124 switch(MATCHER.match(uri)) 125 { 126 case CODE_NOPARAM: 127 return "vnd.android.cursor.dir/person"; 128 case CODE_PARAM: 129 return "vnd.android.cursor.item/person"; 130 default: 131 throw new IllegalArgumentException("this is unkown uri:" + uri); 132 } 133} 134 135@Override 136public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 137{ 138 SQLiteDatabase db = dbHelper.getReadableDatabase(); 139 switch (MATCHER.match(uri)) 140 { 141 case CODE_NOPARAM: 142 return db.query("person", projection, selection, selectionArgs, null, null, sortOrder); 143 case CODE_PARAM: 144 long id = ContentUris.parseId(uri); // 取得跟在URI后面的数字 145 String where = "id = " + id; 146 if (null != selection && !"".equals(selection.trim())) 147 { 148 where += " and " + selection; 149 } 150 return db.query("person", projection, where, selectionArgs, null, null, sortOrder); 151 default: 152 throw new IllegalArgumentException("this is unkown uri:" + uri); 153 } 154} 155 156 } 157 158 159 160 测试代码 161 package cn.xy.test.test; 162 import android.content.ContentResolver; 163 import android.content.ContentValues; 164 import android.database.Cursor; 165 import .Uri; 166 import android.test.AndroidTestCase; 167 import android.util.Log; 168 169 /** 170 * 测试代码 171 * @author xy 172 * 173 */ 174 public class TestProviders extends AndroidTestCase 175 { 176// 在执行该测试方法时需要先将还有内容提供者的项目部署到Android中,否则无法找到内容提供者 177public void testInsert() 178{ 179 Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person"); 180 ContentResolver resolver = this.getContext().getContentResolver(); 181 ContentValues values = new ContentValues(); 182 values.put("name", "xy"); 183 values.put("phone", "111"); 184 resolver.insert(uri, values); // 内部调用内容提供者的insert方法 185} 186 187// 不带id参数的删除 188public void testDelete1() 189{ 190 Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person"); 191 ContentResolver resolver = this.getContext().getContentResolver(); 192 int rowAffect = resolver.delete(uri, null, null); 193 Log.i("rowAffect", String.valueOf(rowAffect)); 194} 195 196// 带参数的删除,通过URI传递了id至contentProvider并可追加其他条件 197public void testDelete2() 198{ 199 Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person/18"); 200 ContentResolver resolver = this.getContext().getContentResolver(); 201 int rowAffect = resolver.delete(uri, "name = ?", new String[] { "XY2" }); // 在provider中手动进行了拼装 202 Log.i("rowAffect", String.valueOf(rowAffect)); 203} 204 205public void testUpdate() 206{ 207 Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person/19"); 208 ContentResolver resolver = this.getContext().getContentResolver(); 209 ContentValues values = new ContentValues(); 210 values.put("name", "newxy"); 211 values.put("phone", "new111"); 212 int rowAffect = resolver.update(uri, values, null, null); 213 Log.i("rowAffect", String.valueOf(rowAffect)); 214} 215 216public void testQuery() 217{ 218 Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person/19"); 219 ContentResolver resolver = this.getContext().getContentResolver(); 220 Cursor cursor = resolver.query(uri, new String[]{"id","name","phone"}, null, null, "id asc"); 221 if(cursor.moveToFirst()) 222 { 223 Log.i("query", cursor.getString(cursor.getColumnIndex("name"))); 224 } 225 cursor.close(); 226} 227 }

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。