开发者社区> 技术小阿哥> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Android内容提供者源码

简介:
+关注继续查看

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

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



本文转自 llb988 51CTO博客,原文链接:http://blog.51cto.com/llb988/518956,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
87 0
Kotlin强势开发一个Android(安卓)程序
一、以IDEA为例,创建一个安卓应用 二、选择安卓,信息填一填 三、点击下一步 四、在Add an Activity to Mobile的时候选择一个基本的Activity(Basic Activity) 五...
855 0
07.Android Studio下Ndk开发(使用fmod播放声音)
(创建于2017/12/28) 已实现 注意几点: 1.main下cpp文件夹放置c文件和相关头文件 2.main下JniLibs文件夹放置第三方so文件 3.
1166 0
Android开发发布真机调试
使用真机测试原因:   1. 模拟器启动慢,真机测试速度较快   2. 有些程序在真机测试才有效,模拟器存在bug,结果要以真机为标准     连接方法:    1.设置手机为开发者模式(设置->关于手机->连续点击MIUI版本——开启成功)   2.
1241 0
13688
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载