1. Android内容提供者源码,我不想说多,只讲一些实用的代码,增删改查。通过contentProvider向数据进行操作。大家可以下载,通过日志与LogCat打印出来的信息作为参考!
  2. packagecom.smart;
  3. importandroid.app.Activity;
  4. importandroid.content.ContentResolver;
  5. importandroid.content.ContentValues;
  6. importandroid.database.Cursor;
  7. importandroid.net.Uri;
  8. importandroid.os.Bundle;
  9. importandroid.provider.ContactsContract;
  10. importandroid.util.Log;
  11. publicclassContentProviderextendsActivity{
  12. privatestaticfinalStringTAG="ContentProvider";
  13. @Override
  14. publicvoidonCreate(BundlesavedInstanceState){
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.main);
  17. //通过这个类,方问DB项目
  18. ContentResolvercontentResolver=this.getContentResolver();
  19. Urialluri=Uri.parse("content://com.smart.provider.personprovider/person");
  20. //Uriuri=Uri.parse("content://com.smart.provider.personprovider/person");
  21. ContentValuesvalues=newContentValues();
  22. values.put("name","smart99");//这里更改就可以了。/
  23. values.put("age",(short)44);
  24. //contentResolver.insert(uri,values);//增加
  25. Uriuri=Uri.parse("content://com.smart.provider.personprovider/person/5");
  26. //contentResolver.update(uri,values,null,null);//更新
  27. //contentResolver.delete(uri,null,null);//删除
  28. //查询
  29. //Cursorcursor=contentResolver.query(uri,newString[]{
  30. //"personid","name","age"},null,null,"personiddesc");
  31. //while(cursor.moveToNext()){
  32. //Log.i(TAG,
  33. //"personid="+cursor.getInt(0)+",name="
  34. //+cursor.getString(1)+",age="
  35. //+cursor.getShort(2));
  36. //}
  37. //cursor.close();
  38. //记得要关掉数据
  39. //01:19
  40. contactMethod();
  41. }
  42. //读取通迅里的人员。
  43. publicvoidcontactMethod(){
  44. //联系人,/媒体库/
  45. ContentResolvercontentResolver=this.getContentResolver();
  46. Cursorcursor=contentResolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
  47. while(cursor.moveToNext()){
  48. intcontactId=cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
  49. Stringname=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
  50. Log.i(TAG,"contactId="+contactId+",name="
  51. +name);
  52. Cursorphones=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
  53. null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId,null,null);
  54. StringBuffersb=newStringBuffer();
  55. while(phones.moveToNext()){
  56. StringphoneNumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
  57. sb.append(phoneNumber).append(",");
  58. }
  59. //电话号码可以得到
  60. Log.i(TAG,sb.toString());
  61. }
  62. cursor.close();
  63. }
  64. }
  65. packagecom.smart.dh;
  66. importandroid.content.ContentProvider;
  67. importandroid.content.ContentUris;
  68. importandroid.content.ContentValues;
  69. importandroid.content.UriMatcher;
  70. importandroid.database.Cursor;
  71. importandroid.database.sqlite.SQLiteDatabase;
  72. importandroid.net.Uri;
  73. importandroid.text.TextUtils;
  74. importcom.smart.service.DataBaseOpenHelper;
  75. /**
  76. *使用内容提供者
  77. ContentProvider共享数据
  78. 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法
  79. 就可以向其它应用共享其数据。虽然使用其它方法对外共享数据,但是数据访问
  80. 方式会因数据存储的方式而不同。,而采用文件操作读写数据,采用sharedoreferences共享数据的需要使用sharedpreferencesAPI读写数据,而使用ContentProvider共享数据的好处
  81. 好处是统一了数据访问方式,当应用需要通过ContentProvider对外共享数据时,第一步需要继承ContentProvider并重写下面的方法。
  82. PublicclassPersonContentProviderextendsContentProvider{
  83. PublicbooleanonCreate();
  84. PublicUriinsert(Uriuri,ContentValuesvalues);
  85. Publicintdelete(Uriuri,Stringselection,String[]selectionArgs);
  86. Publicintupdate(Uriuri,ContentValuesvalues,Stringselection,StringselectionArgs);
  87. PullicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsoftOrder);
  88. PublicStringgetType(Uriuri);
  89. }
  90. 第二步需要在AndroidMandifest.xml使用<provider>对该ContentProvider进行配置,为了能让其它应用找到该ContentProvider,ContentProvider采用了authorites(主机名、域名)对它进行唯一标识,你可以把ContentProvider看作是一个网站(想想,网站也是提供数据者),authorites就是他的域名:
  91. 下面是在要注册信息
  92. <appli…>
  93. <providerandroid:name=”.类名”android:authorities=”con.smart.provider.包名”>
  94. </appli>
  95. 注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider内容提供者
  96. *ContentProvider来自于文件与数据库都可以
  97. *
  98. *Uri介绍
  99. *Uri代表了要操作的数据,Uri主要包含了两部信息:1》
  100. *需要操作的ContentProvider,2>
  101. *对ContentProvider中的,什么数据进行操作,一个Uri由以下几个部分组成。
  102. *content://com.smart.provider.personperovider/person/988
  103. *content://指scheme
  104. *om.smart.provider.personperovider指主机名或authority
  105. *person指路径
  106. *988指ID
  107. **/
  108. publicclassPersonContentProviderextendsContentProvider{
  109. //另一个工程,方问这一个类。
  110. privateDataBaseOpenHelperdbOpenHelper;
  111. privatestaticfinalintALLPERSON=1;
  112. privatestaticfinalintPERSON=2;
  113. privatestaticUriMatchersMatcher=newUriMatcher(UriMatcher.NO_MATCH);//任何不匹配的时候,返回为-1
  114. static{
  115. //
  116. sMatcher.addURI("com.smart.provider.personprovider","person",ALLPERSON);
  117. sMatcher.addURI("com.smart.provider.personprovider","person/#",PERSON);
  118. }
  119. //删除
  120. @Override
  121. publicintdelete(Uriuri,Stringselection,String[]selectionArgs){
  122. SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
  123. intcount=0;//返回的行数
  124. switch(sMatcher.match(uri)){
  125. caseALLPERSON:
  126. count=db.delete("person",selection,selectionArgs);
  127. break;
  128. casePERSON:
  129. longpersonid=ContentUris.parseId(uri);
  130. Stringwhere=TextUtils.isEmpty(selection)?"personid=?"
  131. :selection+"andpersonid=?";
  132. String[]params=newString[]{String.valueOf(personid)};
  133. if(!TextUtils.isEmpty(selection)&&selectionArgs!=null){
  134. params=newString[selectionArgs.length+1];
  135. for(inti=0;i<selectionArgs.length;i++){
  136. params[i]=selectionArgs[i];
  137. }
  138. params[selectionArgs.length+1]=String.valueOf(personid);
  139. }
  140. count=db.delete("person",where,params);
  141. break;
  142. default:
  143. thrownewIllegalArgumentException("UnkowUri:"+uri);
  144. }
  145. returncount;
  146. }
  147. /**
  148. *publicStringgetType(Uriuri)
  149. *方法用于返回URI所代表数据的MIME类型,如果操作的数据发球集合类型,哪么MIME类型
  150. *字符串应该以vnd.android.cursor.dir/开头,要得到所有的person记录Uri为,
  151. *ontent//com.smart.domain/person哪么返回MIME类型字符串应该为,
  152. *vnd.android.cursor.item/开头,比如,得到的ID为1的person记录,URI为
  153. *ontent//com.smart.domain/person/10,哪么返回的MIME类型字符串应该为
  154. *vnd.android.cursor.item/person
  155. **/
  156. //操作数据类型
  157. @Override//这个方法,不实现也可以的。
  158. publicStringgetType(Uriuri){
  159. switch(sMatcher.match(uri)){
  160. caseALLPERSON:
  161. //多条
  162. return"vnd.android.cursor.dir/personprovider.person";
  163. casePERSON:
  164. //personprovider.person内容提供表的
  165. //单条
  166. return"vnd.android.cursor.item/personprovider.person";
  167. default:
  168. thrownewIllegalArgumentException("UnkowUri:"+uri);
  169. }
  170. }
  171. /**
  172. *UriMatcher类的使用介绍因为URI代表了要操作的数据,所以我们很经常需要解析URI,并从URI中获得取数据,ANDROID系统
  173. *提供了两个用于操作URI的工具类,分别为URIMATCHER和CONTENTURIS。掌握它们的使用,会便于我们的开发工作,
  174. *URIMATCHER类于匹配URI。它的用法如下。首先第一步把你需要匹配路径全部给注册上,如下常量
  175. *UriMatcher.NO_MATCH表示不匹配任何路径的返回码UrimatchersMatcher=new
  176. *UriMatcher(UriMatcher.NO_MATCH);
  177. *如果match()方法匹配content//com.smart.domain/person路径,返回匹配为1
  178. *sMatcher.addURI(content//com.smart.domain/person/1);
  179. *如果match()方法匹配content//com.smart.domain/person/230路径,返回匹配为2
  180. *sMatcher.addURI(content//com.smart.domain/person/#,2);/#为通配符
  181. *
  182. *这里讲一下,parse方法为任何的一个字符串转换为Uri地址
  183. *switch(sMatcher.match(Uri.parse("content//com.smart.domain/person/10"))){
  184. *
  185. *}
  186. *
  187. *
  188. *注册完需要匹配的URI后,就可以使用sMatcher.match(Uri)方法对输入进行匹配,如果匹配就返回匹配码
  189. *匹配码是调用ADDRUI()方法传入第三个参数,假设匹配content//com.smart.domain/person路径,返回的匹配码为1
  190. *
  191. ***/
  192. //增加
  193. @Override
  194. publicUriinsert(Uriuri,ContentValuesvalues){
  195. //返回的类型为,返回一路径,
  196. SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
  197. longid=0;
  198. //com.smart.domain/person/100
  199. switch(sMatcher.match(uri)){
  200. caseALLPERSON:
  201. //com.smart.domain/person/
  202. id=db.insert("person","name",values);//记是记录的行号,主健INT类,就是主健,
  203. returnContentUris.withAppendedId(uri,id);
  204. casePERSON:
  205. //com.smart.domain/person/20
  206. db.insert("person","name",values);
  207. Stringpath=uri.toString();
  208. //从0个开始,取到,com.smart.domain/person/20前面20的一个'/'
  209. returnUri.parse(path.substring(0,path.lastIndexOf('/'))+id);
  210. default:
  211. //返回一个参数
  212. thrownewIllegalArgumentException("UnkowUri:"+uri);
  213. }
  214. }
  215. @Override
  216. publicbooleanonCreate(){
  217. dbOpenHelper=newDataBaseOpenHelper(this.getContext());
  218. returntrue;
  219. }
  220. //查询
  221. @Override
  222. publicCursorquery(Uriuri,String[]projection,Stringselection,
  223. String[]selectionArgs,StringsortOrder){
  224. SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
  225. switch(sMatcher.match(uri)){
  226. caseALLPERSON:
  227. returndb.query("person",projection,selection,selectionArgs,null,null,sortOrder);
  228. casePERSON:
  229. longpersonid=ContentUris.parseId(uri);
  230. Stringwhere=TextUtils.isEmpty(selection)?"personid=?"
  231. :selection+"andpersonid=?";
  232. String[]params=newString[]{String.valueOf(personid)};
  233. if(!TextUtils.isEmpty(selection)&&selectionArgs!=null){
  234. params=newString[selectionArgs.length+1];
  235. for(inti=0;i<selectionArgs.length;i++){
  236. params[i]=selectionArgs[i];
  237. }
  238. params[selectionArgs.length+1]=String.valueOf(personid);
  239. }
  240. returndb.query("person",projection,where,params,null,null,sortOrder);
  241. default:
  242. thrownewIllegalArgumentException("UnkowUri:"+uri);
  243. }
  244. }
  245. //更新
  246. @Override
  247. publicintupdate(Uriuri,ContentValuesvalues,Stringselection,
  248. String[]selectionArgs){
  249. SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
  250. intcount=0;//返回的行数
  251. switch(sMatcher.match(uri)){
  252. caseALLPERSON:
  253. count=db.update("person",values,selection,selectionArgs);
  254. break;
  255. casePERSON://com.smart.domain/100
  256. longpersonid=ContentUris.parseId(uri);//得到100的记录
  257. //判断是否为空,为条件
  258. Stringwhere=TextUtils.isEmpty(selection)?"personid=?"
  259. :selection+"andpersonid=?";
  260. String[]params=newString[]{String.valueOf(personid)};
  261. if(!TextUtils.isEmpty(selection)&&selectionArgs!=null){
  262. params=newString[selectionArgs.length+1];
  263. for(inti=0;i<selectionArgs.length;i++){
  264. params[i]=selectionArgs[i];
  265. }
  266. params[selectionArgs.length+1]=String.valueOf(personid);
  267. }
  268. count=db.update("person",values,where,params);
  269. break;
  270. default:
  271. thrownewIllegalArgumentException("UnkowUri:"+uri);
  272. }
  273. returncount;
  274. }
  275. /*****
  276. *增加ContentUris类用于获取Uri路径后面的ID部分,它有两个实用的方法,
  277. *withAppendedld(Uri,id)用于为路径为上ID部分Uri
  278. *uri=Uri.parse("content://com.smart.domain/person");Uri
  279. *resultUri=ContentUris.withAppendedld(uri,10)
  280. *生成后Uri为:content://com.smart.domain/person/10
  281. *
  282. *更新的方法parseld(uri)方法用于从路径中获取ID部分Uri
  283. *uri=Uri.parse("com.smart.domain/person/10");long
  284. *personid=ContentUris.parseld(uri);//获取的结果为10
  285. *
  286. *
  287. ***/
  288. }
  289. <?xmlversion="1.0"encoding="utf-8"?>
  290. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  291. package="com.smart.dh"
  292. android:versionCode="1"
  293. android:versionName="1.0">
  294. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  295. <uses-libraryandroid:name="android.test.runner"/>
  296. <providerandroid:name=".PersonContentProvider"
  297. android:authorities="com.smart.provider.personprovider"
  298. android:permission="com.smart.provider.personprovider"/>
  299. <activityandroid:name=".DBActivity"
  300. android:label="@string/app_name">
  301. <intent-filter>
  302. <actionandroid:name="android.intent.action.MAIN"/>
  303. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  304. </intent-filter>
  305. </activity>
  306. </application>
  307. <uses-sdkandroid:minSdkVersion="8"/>
  308. <instrumentationandroid:name="android.test.InstrumentationTestRunner"
  309. android:targetPackage="com.smart.dh"android:label="TestsforMyApp"/>
  310. </manifest>
  311. <!--android:permission="cn.itcast.provider.personprovider"
  312. 这行是指权限android:permission="com.smart.domain"
  313. com.smart.domain
  314. -->

大家记住了,两个工程,一定都导进来,然后运行。

更多相关文章

  1. Android(安卓)数据业务框架分析
  2. 基于Android(安卓)DataBinding的InverseBindingMethod改进SeekBa
  3. Android中ExpandableListView的使用
  4. 2010.10.30———Android(安卓)03
  5. android SIM卡状态
  6. Android上Sensor移植的总结
  7. android应用安全——数据安全
  8. Android之使用传感器获取相应数据
  9. mybatisplus的坑 insert标签insert into select无参数问题的解决

随机推荐

  1. 关于广播接受者的问题
  2. Android小项目——简易备忘录
  3. android获取通知权限
  4. VisionMobile:2014年Q1移动开发者经济报告
  5. 基于android的音乐APP大作业和设计指导项
  6. android studio 实现再按一次返回键退出
  7. Cordova + vue 打包安卓(Android) apk 及
  8. android短信监听
  9. Android 线程
  10. android加载大图片