1. #ContentProvider,就是来操作数据的,增删改查,
  2. * 四大组件之一
  3. * 应用的数据库是不允许其他应用访问的
  4. * 内容提供者的作用就是让别的应用访问到你的数据库
  5. * 内容提供者的作用:把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用
  6. *短信联系人都是在数据库里面。mmssms是短信数据库,
  7. *短信数据库有短信数据库的内容提供者,联系人数据库有联系人数据库的内容提供者。拿到对应数据库的内容提供者就能够访问对应的数据库数据。
  8.  
  9. ###短信数据库
  10. * sms
  11. * body:短信内容
  12. * date:短信时间
  13. * address:对方号码
  14. * type:发送还是接收
  15.  
  16. ###联系人数据库
  17. * raw_contacts
  18. * contact_id:联系人id
  19. * data表:存放联系人的详细的信息,每行数据是单独的一条联系人信息
  20. * data1:联系人的具体的信息
  21. * raw_contact_id:该行信息属于哪个联系人
  22. * mimetype_id:该行信息属于什么类型
  23. * mimetypes表:mimetype_id对应的类型的字符串
  24.  
  25. ###UriMatcher
  26. * 用于判断一条uri跟指定的多条uri中的哪条匹配
  27. * 添加匹配规则
  28.  
  29. //指定多条uri
  30. um.addURI("com.itheima.person", "person", PERSON_CODE);
  31. um.addURI("com.itheima.person", "company", COMPANY_CODE);
  32. //#号可以代表任意数字
  33. um.addURI("com.itheima.person", "person/#", QUERY_ONE_PERSON_CODE);
  34. * 通过Uri匹配器可以实现操作不同的表
  35.  
  36. @Override
  37. public Uri insert(Uri uri, ContentValues values) {
  38. if(um.match(uri) == PERSON_CODE){
  39. db.insert("person", null, values);
  40. }
  41. else if(um.match(uri) == COMPANY_CODE){
  42. db.insert("company", null, values);
  43. }
  44. else{
  45. throw new IllegalArgumentException();
  46. }
  47. return uri;
  48. }
  49. * 如果路径中带有数字,把数字提取出来的api
  50.  
  51. int id = (int) ContentUris.parseId(uri);
  1. 01项目的MyOpenHelper:
  2.  
  3. package com.itheima.customcontentprovider;
  4.  
  5. import android.content.Context;
  6. import android.database.sqlite.SQLiteDatabase;
  7. import android.database.sqlite.SQLiteDatabase.CursorFactory;
  8. import android.database.sqlite.SQLiteOpenHelper;
  9.  
  10. public class MyOpenHelper extends SQLiteOpenHelper {
  11.  
  12. public MyOpenHelper(Context context) {
  13. super(context, "people.db", null, 2);
  14. }
  15.  
  16. @Override
  17. public void onCreate(SQLiteDatabase db) {
  18. db.execSQL("create table person(_id integer primary key autoincrement, name char(10), money integer(20))");
  19. }
  20.  
  21. @Override
  22. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  23. db.execSQL("create table teacher(_id integer primary key autoincrement, name char(10))");
  24. }
  25. }
  1. 01项目Test.java
  2.  
  3. package com.itheima.customcontentprovider;
  4.  
  5. import android.test.AndroidTestCase;
  6.  
  7. public class Test extends AndroidTestCase {
  8.  
  9. public void test(){
  10. MyOpenHelper oh = new MyOpenHelper(getContext());//getContext()是获取虚礼上下文
  11. oh.getWritableDatabase();
  12. }
  13. }
  1. 02项目的MainActivity.java
  2.  
  3. package com.itheima.visitprovider;
  4.  
  5. import android.net.Uri;
  6. import android.os.Bundle;
  7. import android.app.Activity;
  8. import android.content.ContentResolver;
  9. import android.content.ContentValues;
  10. import android.database.Cursor;
  11. import android.view.Menu;
  12. import android.view.View;
  13.  
  14. public class MainActivity extends Activity {
  15.  
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_main);
  20. }
  21.  
  22. public void insert(View v){
  23. //通过内容提供者把数据插入people数据库
  24. //拿到contentResolver来访问内容提供者
  25. ContentResolver cr = getContentResolver();
  26. ContentValues values = new ContentValues();
  27. values.put("name", "赵帅哥");
  28. // values.put("money", "13000");
  29. //url:内容提供者的主机名地址
  30. //values:要插入的数据
  31. cr.insert(Uri.parse("content://com.itheima.people/teacher"), values);//com.itheima.people是01项目的内容提供者的地址,teacher表示插入teacher表
  32.  
  33. }
  34.  
  35. public void delete(View v){
  36. ContentResolver cr = getContentResolver();
  37. int i = cr.delete(Uri.parse("content://com.itheima.people"), "name = ?", new String[]{"小志"});
  38. System.out.println(i);
  39. }
  40. public void update(View v){
  41. ContentResolver cr = getContentResolver();
  42. ContentValues values = new ContentValues();
  43. values.put("name", "sb志");
  44. int i = cr.update(Uri.parse("content://com.itheima.people"), values, "name = ?", new String[]{"大志"});
  45. System.out.println(i);
  46. }
  47.  
  48. public void select(View v){
  49. ContentResolver cr = getContentResolver();
  50. Cursor cursor = cr.query(Uri.parse("content://com.itheima.people/person/4"), null, null, null, null);//person表示是person表,4是用来作id的,
  51. while(cursor.moveToNext()){
  52. String name = cursor.getString(1);
  53. String money = cursor.getString(2);
  54. System.out.println(name + ";" + money);
  55. }
  56. }
  57.  
  58. }
  1. 01项目PersonProvider.java
  2.  
  3. package com.itheima.customcontentprovider.provider;
  4.  
  5. import com.itheima.customcontentprovider.MyOpenHelper;
  6.  
  7. import android.content.ContentProvider;
  8. import android.content.ContentUris;
  9. import android.content.ContentValues;
  10. import android.content.UriMatcher;
  11. import android.database.Cursor;
  12. import android.database.sqlite.SQLiteDatabase;
  13. import android.net.Uri;
  14.  
  15. public class PersonProvider extends ContentProvider {
  16.  
  17. private MyOpenHelper oh;
  18. SQLiteDatabase db;
  19.  
  20. //创建uri匹配器对象
  21. static UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);
  22. //检测其他用户传入的uri与匹配器定义好的uri中,哪条匹配
  23. static {
  24. um.addURI("com.itheima.people", "person", 1);//content://com.itheima.people/person
  25. um.addURI("com.itheima.people", "teacher", 2);//content://com.itheima.people/teacher
  26. um.addURI("com.itheima.people", "person/#", 3);//content://com.itheima.people/person/4,#表示任何数字,*表示任何文本,
  27. }
  28.  
  29. //内容提供者创建时调用
  30. @Override
  31. public boolean onCreate() {
  32. oh = new MyOpenHelper(getContext());
  33. db = oh.getWritableDatabase();
  34. return false;
  35. }
  36.  
  37. @Override
  38. public Cursor query(Uri uri, String[] projection, String selection,
  39. String[] selectionArgs, String sortOrder) {
  40. Cursor cursor = null;
  41. if(um.match(uri) == 1){
  42. cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder, null);
  43. }
  44. else if(um.match(uri) == 2){
  45. cursor = db.query("teacher", projection, selection, selectionArgs, null, null, sortOrder, null);
  46. }
  47. else if(um.match(uri) == 3){
  48. //把uri末尾携带的数字取出来
  49. long id = ContentUris.parseId(uri);
  50. cursor = db.query("person", projection, "_id = ?", new String[]{id + ""}, null, null, sortOrder, null);
  51. }
  52. else{
  53. throw new IllegalArgumentException("uri又有问题哟亲么么哒");
  54. }
  55. return cursor;
  56. }
  57.  
  58. @Override
  59. public String getType(Uri uri) {
  60. if(um.match(uri) == 1){
  61. return "vnd.android.cursor.dir/person";//表示请求的是person的多条数据
  62. }
  63. else if(um.match(uri) == 3){
  64. return "vnd.android.cursor.item/person";//表示请求的是person的单条数据
  65. }
  66. return null;
  67. }
  68.  
  69. //此方法供其他应用调用,用于往people数据库里插数据
  70. //values:由其他应用传入,用于封装要插入的数据
  71. //uri:内容提供者的主机名,也就是地址
  72. @Override
  73. public Uri insert(Uri uri, ContentValues values) {
  74. //使用uri匹配器匹配传入的uri
  75. if(um.match(uri) == 1){
  76. db.insert("person", null, values);
  77.  
  78. //发送数据改变的通知
  79. //uri:通知发送到哪一个uri上,所有注册在这个uri上的内容观察者都可以收到这个通知
  80. getContext().getContentResolver().notifyChange(uri, null);
  81. }
  82. else if(um.match(uri) == 2){
  83. db.insert("teacher", null, values);
  84.  
  85. getContext().getContentResolver().notifyChange(uri, null);
  86. }
  87. else{
  88. throw new IllegalArgumentException("uri有问题哟亲么么哒");
  89. }
  90. return uri;
  91. }
  92.  
  93. @Override
  94. public int delete(Uri uri, String selection, String[] selectionArgs) {
  95. int i = db.delete("person", selection, selectionArgs);
  96. return i;
  97. }
  98.  
  99. @Override
  100. public int update(Uri uri, ContentValues values, String selection,
  101. String[] selectionArgs) {
  102. int i = db.update("person", values, selection, selectionArgs);
  103. return i;
  104. }
  105.  
  106. }
  107. /*
  108. 清单文件:
  109. <provider android:name="com.itheima.customcontentprovider.provider.PersonProvider"
  110. android:authorities="com.itheima.people"
  111. android:exported="true">
  112. </provider>
  113. authorities="com.itheima.people"是一个地址,是内容提供者的地址,通过这个地址就可以访问到这个内容提供者
  114.  
  115. <instrumentation android:name="android.test.InstrumentationTestRunner"
  116. android:targetPackage="com.itheima.customcontentprovider">
  117. </instrumentation>
  118. */

02项目就访问到了01项目的数据库。

android100 自定义内容提供者的更多相关文章

  1. Android开发学习—— ContentProvider内容提供者

    * 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的数据库.把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用. Uri:包含一个具有一定格式的字符串的对 ...

  2. Android应用开发基础之九:内容提供者(ContentProvider)

    内容提供者 应用的数据库是不允许其他应用访问的 内容提供者的作用:就是让别的应用访问到你的数据库 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代 ...

  3. android 学习随笔二十一(内容提供者 )

    一.内容提供者* 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的私有数据* 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查 ...

  4. 内容提供者(Content Provider)——跨程序共享数据

    内容提供者 Content Provider 应用的数据库是不允许其他应用访问的 内容提供者的作用就是让别的应用访问到你的数据库 自定义内容提供者,继承ContentProvider类,重写增删改查方 ...

  5. 【Android】安卓四大组件之内容提供者

    [Android]安卓四大组件之内容提供者 1.关于内容提供者 1.1 什么是内容提供者 内容提供者就是contentProvider,作用有如下: 给多个应用提供数据 类似一个接口 可以和多个应用分 ...

  6. 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

    1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and ...

  7. Android 内容提供者简介

    在Android应用中,我们可以使用显式意图(Explicit Intent)来直接访问其他应用的Activity,但是这仅限于Activity的范畴:如果需要使用其他应用的数据,还需要用到另外一种组 ...

  8. Android组件系列----ContentProvider内容提供者

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  9. contentProvider内容提供者

    contentProvider内容提供者 15. 四 / android基础 / 没有评论   步骤 权限在application中注册 Source code     <provider an ...

随机推荐

  1. VirtualBox虚拟vdi磁盘扩容

    http://blog.chinaunix.net/uid-25627207-id-3342576.html

  2. is present but cannot be translated into a null value due to being declared as a primitive type

    解决办法:把基本类型改为对象,譬如此处将pageId的类型由int 改为Integer 2016-10-19 19:36:11.275 DEBUG [http-nio-9999-exec-2][org ...

  3. ServletInvocableHandlerMethod:167 - Error resolving argument

    at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(R ...

  4. C#中的@符号

      C# 中的 @ 符号 C# 中的 @ 符号其实有很多的用法,我们来看看 @ 有什么神奇之处. 1. 限定字符串 用 @ 符号加在字符串前面表示其中的转义字符 “ 不 ” 被处理. 如果我们写一个文 ...

  5. Linux Kernel 本地内存损坏漏洞

    漏洞名称: Linux Kernel 本地内存损坏漏洞 CNNVD编号: CNNVD-201310-663 发布时间: 2013-11-05 更新时间: 2013-11-05 危害等级:    漏洞类 ...

  6. asp.net mvc ChildActionOnly 和ActionName的用法

    ChildActionOnly的目的主要就是让这个Action不通过直接在地址栏输入地址来访问,而是需要通过RenderAction来调用它. <a href="javascript: ...

  7. 了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密

    关系型数据库,如SQL Server,使用锁来避免多用户修改数据时的并发冲突.当一组数据被某个用户锁定时,除非第一个用户结束修改并释放锁,否则其他用户就无法修改该组数据. 有些数据库,包括SQL Se ...

  8. 深入理解OAuth2.0

    1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...

  9. LightOJ 1138 Trailing Zeroes (III) 打表

    就是统计5,然后当时因为发现最多有8000w个5的倍数,然后8000w/100,是80w,打表,二分找 然后我看网上的都是直接二分找,真是厉害 #include <cstdio> #inc ...

  10. POJ 2502 Subway dij

    这个题的输入输出注意一下就好 #include<cstdio> #include<cstring> #include<queue> #include<cstd ...