#ContentProvider,就是来操作数据的,增删改查,
* 四大组件之一
* 应用的数据库是不允许其他应用访问的
* 内容提供者的作用就是让别的应用访问到你的数据库
* 内容提供者的作用:把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用
*短信联系人都是在数据库里面。mmssms是短信数据库,
*短信数据库有短信数据库的内容提供者,联系人数据库有联系人数据库的内容提供者。拿到对应数据库的内容提供者就能够访问对应的数据库数据。###短信数据库
* sms表* body:短信内容* date:短信时间* address:对方号码* type:发送还是接收###联系人数据库
* raw_contacts表* contact_id:联系人id
* data表:存放联系人的详细的信息,每行数据是单独的一条联系人信息* data1:联系人的具体的信息* raw_contact_id:该行信息属于哪个联系人* mimetype_id:该行信息属于什么类型
* mimetypes表:mimetype_id对应的类型的字符串###UriMatcher
* 用于判断一条uri跟指定的多条uri中的哪条匹配
* 添加匹配规则//指定多条urium.addURI("com.itheima.person", "person", PERSON_CODE);um.addURI("com.itheima.person", "company", COMPANY_CODE);//#号可以代表任意数字um.addURI("com.itheima.person", "person/#", QUERY_ONE_PERSON_CODE);
* 通过Uri匹配器可以实现操作不同的表@Overridepublic Uri insert(Uri uri, ContentValues values) {if(um.match(uri) == PERSON_CODE){db.insert("person", null, values);}else if(um.match(uri) == COMPANY_CODE){db.insert("company", null, values);}else{throw new IllegalArgumentException();}return uri;}
* 如果路径中带有数字,把数字提取出来的apiint id = (int) ContentUris.parseId(uri);

01项目的MyOpenHelper:

package com.itheima.customcontentprovider;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;public class MyOpenHelper extends SQLiteOpenHelper {public MyOpenHelper(Context context) {super(context, "people.db", null, 2);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("create table person(_id integer primary key autoincrement, name char(10), money integer(20))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("create table teacher(_id integer primary key autoincrement, name char(10))");}
}

01项目Test.java

package com.itheima.customcontentprovider;import android.test.AndroidTestCase;public class Test extends AndroidTestCase {public void test(){MyOpenHelper oh = new MyOpenHelper(getContext());//getContext()是获取虚礼上下文
        oh.getWritableDatabase();}
}

02项目的MainActivity.java

package com.itheima.visitprovider;import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void insert(View v){//通过内容提供者把数据插入people数据库//拿到contentResolver来访问内容提供者ContentResolver cr = getContentResolver();ContentValues values = new ContentValues();values.put("name", "赵帅哥");
//        values.put("money", "13000");//url:内容提供者的主机名地址//values:要插入的数据cr.insert(Uri.parse("content://com.itheima.people/teacher"), values);//com.itheima.people是01项目的内容提供者的地址,teacher表示插入teacher表
        }public void delete(View v){ContentResolver cr = getContentResolver();int i = cr.delete(Uri.parse("content://com.itheima.people"), "name = ?", new String[]{"小志"});System.out.println(i);}public void update(View v){ContentResolver cr = getContentResolver();ContentValues values = new ContentValues();values.put("name", "sb志");int i = cr.update(Uri.parse("content://com.itheima.people"), values, "name = ?", new String[]{"大志"});System.out.println(i);}public void select(View v){ContentResolver cr = getContentResolver();Cursor cursor = cr.query(Uri.parse("content://com.itheima.people/person/4"), null, null, null, null);//person表示是person表,4是用来作id的,while(cursor.moveToNext()){String name = cursor.getString(1);String money = cursor.getString(2);System.out.println(name + ";" + money);}}}

01项目PersonProvider.java

package com.itheima.customcontentprovider.provider;import com.itheima.customcontentprovider.MyOpenHelper;import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;public class PersonProvider extends ContentProvider {private MyOpenHelper oh;SQLiteDatabase db;//创建uri匹配器对象static UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);//检测其他用户传入的uri与匹配器定义好的uri中,哪条匹配static {um.addURI("com.itheima.people", "person", 1);//content://com.itheima.people/personum.addURI("com.itheima.people", "teacher", 2);//content://com.itheima.people/teacherum.addURI("com.itheima.people", "person/#", 3);//content://com.itheima.people/person/4,#表示任何数字,*表示任何文本,
    }//内容提供者创建时调用
    @Overridepublic boolean onCreate() {oh = new MyOpenHelper(getContext());db = oh.getWritableDatabase();return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {Cursor cursor = null;if(um.match(uri) == 1){cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder, null);}else if(um.match(uri) == 2){cursor = db.query("teacher", projection, selection, selectionArgs, null, null, sortOrder, null);}else if(um.match(uri) == 3){//把uri末尾携带的数字取出来long id = ContentUris.parseId(uri);cursor = db.query("person", projection, "_id = ?", new String[]{id + ""}, null, null, sortOrder, null);}else{throw new IllegalArgumentException("uri又有问题哟亲么么哒");}return cursor;}@Overridepublic String getType(Uri uri) {if(um.match(uri) == 1){return "vnd.android.cursor.dir/person";//表示请求的是person的多条数据
        }else if(um.match(uri) == 3){return "vnd.android.cursor.item/person";//表示请求的是person的单条数据
        }return null;}//此方法供其他应用调用,用于往people数据库里插数据//values:由其他应用传入,用于封装要插入的数据//uri:内容提供者的主机名,也就是地址
    @Overridepublic Uri insert(Uri uri, ContentValues values) {//使用uri匹配器匹配传入的uriif(um.match(uri) == 1){db.insert("person", null, values);//发送数据改变的通知//uri:通知发送到哪一个uri上,所有注册在这个uri上的内容观察者都可以收到这个通知getContext().getContentResolver().notifyChange(uri, null);}else if(um.match(uri) == 2){db.insert("teacher", null, values);getContext().getContentResolver().notifyChange(uri, null);}else{throw new IllegalArgumentException("uri有问题哟亲么么哒");}return uri;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {int i = db.delete("person", selection, selectionArgs);return i;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {int i = db.update("person", values, selection, selectionArgs);return i;}}
/*清单文件:
<provider android:name="com.itheima.customcontentprovider.provider.PersonProvider"
android:authorities="com.itheima.people"
android:exported="true">
</provider>
authorities="com.itheima.people"是一个地址,是内容提供者的地址,通过这个地址就可以访问到这个内容提供者<instrumentation android:name="android.test.InstrumentationTestRunner"android:targetPackage="com.itheima.customcontentprovider">
</instrumentation>
*/

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

转载于:https://www.cnblogs.com/yaowen/p/4970145.html

android100 自定义内容提供者相关推荐

  1. 安卓学习笔记36:内容提供者

    文章目录 一.内容提供者 (一)概述 (二)作用 二.案例演示 - 显示系统联系人 (一)运行效果 (二)涉及知识点 (三)实现步骤 1.创建安卓应用[DisplayContacts] 2.将背景图片 ...

  2. Day10安卓 专高 day10 ContentProvider内容提供者

    Day10安卓 专高 day10 ContentProvider内容提供者 安卓 专高 day10 ContentProvider内容提供者 ContentProvider 的使用 内容提供者,就是给 ...

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

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

  4. 安卓学习 之 ContentResolver内容提供者(七)

    简介 Android持久化技术一章中所保存的数据都只能在当前应用程序中访问,但跨程序数据共享是由Content Provider提供的,譬如说:电话薄.短信.媒体库中的信息. 一.基本用法 构建内容U ...

  5. Android ContentProvider 内容提供者

    ContentProvider 内容提供者,是Android四大组件之一. 一.简述 可以理解为一个特殊的存储数据的类型,它提供了一套标准的接口来获取和操作数据.可以把数据封装到ContentProv ...

  6. Android基础知识巩固系列 Android之四大组件——ContentProvider(内容提供者)

    因为最近要面试,于是打算整理整理一下Android的基础知识,由于之前本人已经学习过大概的Android基础知识,这里主要讲这四大组件.五大存储.六大布局.网络请求等这些内容,其他一些等有时间再整理, ...

  7. Android组件系列----ContentProvider内容提供者 和 android:authorities

    authorities 是provider所在的包的名字+provider本身定义的名称 ---zgs [正文] 一.ContentProvider简介: ContentProvider内容提供者(四 ...

  8. 内容提供者ContentProvider, 读写加联系人,读写通话记录,监听收到的短信,获取之前已经收到的短信

    1.什么是内容提供者? 首先我们必须要明白的是ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用比较少.ContentProvider为不同的软 ...

  9. html5网页怎么实现内容追加,纯js实现网页内容复制后自动追加自定义内容

    网页操作内容复制内容后纯js实现监听自动追加自定义内容 不少网站技术或者博客上有这样的处理,当我们复制代码的时候,会自动加上一段本信息版权为XXXX,这是怎么实现的呢? 其实实现的方式很简单,可以在我 ...

最新文章

  1. 我要学ASP.NET MVC 3.0(一): MVC 3.0 的新特性
  2. OpenCV实现在图像中写入汉字
  3. php 字符串处理
  4. 2020互联网大厂薪资出炉!来源OfferShow爆料整理
  5. 数据存储之 SQLite 数据库操作(一)
  6. 延迟开学不停学|网易云信在线教育解决方案为“空中课堂”保驾护航
  7. Android App 瘦身总结 第一章 图片资源的优化处理
  8. 一站式学习Wireshark(七):Statistics统计工具功能详解与应用
  9. Abp 0.18.0 正式发布! -ABP CLI,新模板和其他功能
  10. 2019.01.22【NOIP普及组】模拟赛C组总结
  11. Python-pillow库显示MNIST图片的方法
  12. idea编译后target文件不全_IntelliJ IDEA 不能更新target中的java等部分文件
  13. seafile Windows MySQL_seafile4.3.1 + windows 2012 server +mysql 部署记录(3)
  14. Win7 64位 IIS未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项
  15. Firefox 4.0浏览器正式版再次推迟发布
  16. HBase项目之微博系统
  17. 工业相机的曝光时间和帧率的关系
  18. 一级计算机软件wps,计算机一级WPS
  19. 计算机语言市场份额,21年7月编程语言排名:python上升迅速,others占比最高
  20. Failed to build custom metric java.lang.NumberFormatException: For input string: “∞“

热门文章

  1. 12 求1+2+...+n
  2. codetyphon, Lazarus+FreePascal+Tools+Free Components packages+Free Libraries
  3. 聚集索引和非聚集索引实例
  4. 系分考试论文实例12篇
  5. bzoj 1004: [HNOI2008]Cards
  6. Python常用模块——目录
  7. 160613、MyBatis insert操作返回主键
  8. 前端画面-下拉后滚动
  9. select count(*)和select count(1)的区别(转载)
  10. Windows核心编程 第三章 内核对象