作为四大组件之一,ContentProvider 算是我直接使用次数最少的一个了。主要提供应用程序之间共享数据的接口

一、创建ContentProvider 实例

ContentProvider是一个抽象类。创建MyProvider类继承ContentProvider,实现6个抽象方法:onCreategetTypequeryinsertdeleteupdate

onCreate()方法会在创建的时候调用一次。其它方法通过ContentResolver的增删改查方法触发。

所以我们只需要在对应的方法下对数据库进行增删改查就行了。

public class MyProvider extends ContentProvider {private static final String TAG = "MyProvider";@Overridepublic boolean onCreate() {Log.d(TAG, "onCreate, Thread:" + Thread.currentThread().getName());return false;}@Nullable@Overridepublic String getType(@NonNull Uri uri) {Log.d(TAG, "getType, Thread:" + Thread.currentThread().getName());return null;}@Nullable@Overridepublic Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {Log.d(TAG, "query, Thread:" + Thread.currentThread().getName());return SqlHelper.getInstance().query(TeacherTable.TABLE_NAME, projection, selection, selectionArgs);}@Nullable@Overridepublic Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {Log.d(TAG, "insert, Thread:" + Thread.currentThread().getName());SqlHelper.getInstance().insert(TeacherTable.TABLE_NAME, values);return null;}@Overridepublic int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {Log.d(TAG, "delete, Thread:" + Thread.currentThread().getName());SqlHelper.getInstance().delete(TeacherTable.TABLE_NAME, selection, selectionArgs);return 0;}@Overridepublic int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {Log.d(TAG, "update, Thread:" + Thread.currentThread().getName());SqlHelper.getInstance().update(TeacherTable.TABLE_NAME, values, selection, selectionArgs);return 0;}
}

二、注册ContentProvider

        <providerandroid:authorities="test.com.provider.MyProvider"android:name=".provider.MyProvider"
//            android:process=":provider"
//            android:permission="com.zy.android.PROVIDER"/>
  • authorities : 是ContentProvider 的唯一标识,所以最好加上包名前缀
  • name : 需要注册的ContentProvider 名

三、使用

1、插入:

 Uri uri = Uri.parse("content://test.com.provider.MyProvider");ContentValues values = new ContentValues();values.put(TeacherTable.COLUMN_NAME, "张三");values.put(TeacherTable.COLUMN_GRADE,"1");values.put(TeacherTable.COLUMN_CLS,"3");values.put(TeacherTable.COLUMN_ID, id);getContentResolver().insert(uri,values);

在Uri 中指明ContentProvider 的标识,也就是注册的authorities属性值。
固定写法:Uri.parse("content://authorities")

通过getContentResolver()获得ContentResolver对象。

2、删除

getContentResolver().delete(uri, "name = ?", new String[]{"张三"});

3、修改

ContentValues values2 = new ContentValues();
values2.put(TeacherTable.COLUMN_NAME, "王二麻子");
values2.put(TeacherTable.COLUMN_GRADE,"1");
values2.put(TeacherTable.COLUMN_CLS,"3");
//values.put(TeacherTable.COLUMN_ID, id);
getContentResolver().update(uri, values2, "name = ? ", new String[]{"张三"});

将张三修改成王二麻子

4、查询

Cursor cursor = getContentResolver().query(uri, null, "name = ? ", new String[]{"张三"}, "1");

查询操作会返回一个Cursor对象,通过对Cursor 操作,获得值。

        if (cursor == null){return;}cursor.moveToFirst();StringBuffer sb = new StringBuffer();while (!cursor.isAfterLast()){sb.append("ID:" + cursor.getInt(cursor.getColumnIndex(TeacherTable.COLUMN_ID))+ " name:" + cursor.getString(cursor.getColumnIndex(TeacherTable.COLUMN_NAME))+ " grade:"+ cursor.getString(cursor.getColumnIndex(TeacherTable.COLUMN_GRADE))+ " cls: " + cursor.getString(cursor.getColumnIndex(TeacherTable.COLUMN_CLS))+ "\n");cursor.moveToNext();}cursor.close();

ContentProvider的query方法需要返回Cursor 才行,否则获得的是一个空对象。

TeacherTable表结构

public class TeacherTable {//表名public static final String TABLE_NAME = "teacher";//列public static final String COLUMN_ID    = "id";public static final String COLUMN_NAME  = "name";public static final String COLUMN_GRADE = "grade";public static final String COLUMN_CLS   = "cls";//创建teacher表public static final String CREATE_TABLE = "CREATE TABLE "  //"CREATE TABLE IF NOT EXISTS "+ TABLE_NAME + "("+ COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"+ COLUMN_NAME + " TEXT,"+ COLUMN_GRADE + " TEXT,"+ COLUMN_CLS + " TEXT"+ ")";private int id;private String name;private String grade;private String cls;
}

SqlHelper

/*** Created by zy* date 2019/12/24 0024.* desc:*/
public class SqlHelper extends SQLiteOpenHelper {//数据库名private static final String DB_NAME = "test_db";//数据库版本private static final int DB_VERSION = 1;public static SqlHelper instance;public static SqlHelper getInstance(){if (instance == null){instance = new SqlHelper(MyApp.context);}return instance;}/*** @param context 上下文*                数据库名称*                数据库游标工厂类(可选)*                数据库版本*/public SqlHelper(@Nullable Context context) {super(context, DB_NAME, null, DB_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {//创建教师表db.execSQL(TeacherTable.CREATE_TABLE);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {String drop = "DROP TABLE IF EXISTS ";//drop older table existeddb.execSQL(drop + TeacherTable.TABLE_NAME);onCreate(db);}/*** 插入** @param tableName 表名* @param values* @return 插入是否成功*/public boolean insert(String tableName, ContentValues values) {SQLiteDatabase db = this.getWritableDatabase();long res = db.insert(tableName, null, values);return res != -1;}/*** 根据条件删除* @param tableName* @param where* @param args* @return*/public boolean delete(String tableName, String where, String[] args) {try {SQLiteDatabase db = this.getWritableDatabase();db.delete(tableName, where, args);return true;} catch (Exception e) {e.printStackTrace();}return false;}/*** 修改* @param tableName* @param id* @param values* @return*/public boolean update(String tableName, String id, ContentValues values) {try {SQLiteDatabase db = this.getWritableDatabase();db.update(tableName, values, TeacherTable.COLUMN_ID + " = ? ", new String[]{id});return true;} catch (Exception e) {e.printStackTrace();Log.e("tag","update Exception: " + e.toString());}return false;}/*** 更新* @param tableName* @param values* @param selection* @param selectionArgs*/public void update(String tableName, ContentValues values, String selection, String[] selectionArgs){SQLiteDatabase db = this.getWritableDatabase();db.update(tableName, values, selection, selectionArgs);}/*** 查询* @param tableName* @param columns* @param selection* @param selectionArgs* @return*/public Cursor query(String tableName, String[] columns, String selection, String[] selectionArgs) {try {SQLiteDatabase db = this.getReadableDatabase();Cursor cursor = db.query(tableName, columns, selection, selectionArgs, null, null, null);return cursor;} catch (Exception e) {e.printStackTrace();}return null;}
}

总结

关于SQLite使用,可以看我的另一篇文字:Android SQLite简单使用

因为四大组件中ContentProvider主动使用频率比较低,所以没有去过多深入了解,只是记录使用方式。

其它三大组件工作流程:

Activity的启动流程

BroadcastReceiver 工作过程

Service启动流程

ContentProvider使用相关推荐

  1. ContentProvider是如何实现数据共享的

    ContentProvider用于跨进程通讯,一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数据 ...

  2. ContentProvider访问问题

    问题解决一: 写了一个类,实现了ContentProvider,在清单文件中也注册了. <provider android:name=".provider.MyProvider&quo ...

  3. contentProvider的使用总结

    一.使用ContentProvider(内容提供者)共享数据 ContentProvider在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给 ...

  4. android 53 ContentProvider内容提供者

    ContentProvider内容提供者:像是一个中间件一样,一个媒介一样,可以以标准的增删改差操作对手机的文件.数据库进行增删改差.通过ContentProvider查找sd卡的音频文件,可以提供标 ...

  5. Android ContentProvider和getContentResolver

    安卓系统中的数据库SqlLite操作和java中mysql的数据库操作很不一样,造成这样的原因是因为在安卓中数据库是属于进程的不存在数据库客户端,也不存在数据库服务器. 关于SqlLite数据库的文章 ...

  6. 创建ContentProvider的详细步骤

    2019独角兽企业重金招聘Python工程师标准>>> Content Provider管理中央存储库的数据的访问, 你在Android程序中实现一个或者多个Provider, 连同 ...

  7. 使用ContentProvider

    2019独角兽企业重金招聘Python工程师标准>>> 一. 了解 ContentProvider 1.   什么是ContentProvider 让开发者在多个应用中操作数据,如存 ...

  8. Android开发之ContentProvider结合LoaderManager加载数据(图文源代码分享)

    ContentProvider作为Android的四大存储方式之一,有着广泛的应用性,它暴露了数据地址,可以让其他应用访问数据,可以用于存储图片.通讯录等信息,这篇博文将详细介绍ContentProv ...

  9. Android Service、 BroadcastReceiver、ContentProvider ANR 原理详解

    Service ANR: 启动Service 的时候,会调用到ActiveServices 类的 realStartServiceLocked方法. private final void realSt ...

  10. ContentProvider使用场景解读

    为什么需要ContentProvider? 我们知道,一个软件系统的架构通常是这样的: 为了降低上层业务对底层数据的依赖,需要增加一个数据访问层来解耦,我们今天要说的ContentProvider充当 ...

最新文章

  1. 不到顶会现场也能听论文讲解?这个视频集合网站值得收藏
  2. 金山词霸2012不能在PDF中取词 解决办法
  3. Java 基础学习(Markdown语法)
  4. divcss布局模板代码_(带手机版数据同步)房产门户企业织梦模板 房地产楼盘网站源码下载...
  5. 编译安装openresty+mysql+php7
  6. core webapi缩略图_.Net Core WebApi上传图片的两种方式
  7. 三维重建4:Jacobian矩阵和Hessian矩阵
  8. matlab中find()函数用法
  9. 安装logstash5.4.1,并使用grok表达式收集nginx日志
  10. 完美解决eclipse编辑器中文字符过小问题
  11. 小程序直播 OBS 画质_教你玩转微信小程序直播
  12. 采用WPF开发第二版OFD阅读器
  13. matlab的foramt
  14. office文档在线浏览:关于 Office Online 使用方法
  15. Web 前端通过调用ActiveX实现LPT1端口小票机打印功能。
  16. 初级软件测试工程师:测试路上披荆斩棘,争做大厂程序员,斩获高薪offer~
  17. 用计算机画漫画很难吗,怎么在电脑上画漫画,难不难
  18. SVN的安装和使用基础教程
  19. 心理测评软件php mysql_中学心理测评软件
  20. win10电脑设置鼠标文本选择时光标样式和颜色

热门文章

  1. 江苏卫视南瓜芽童装斥责骗子
  2. Idea 解决SVN冲突
  3. LBP算法提取图片纹理特征图
  4. airflow的学习使用
  5. 主动电容笔和被动电容笔有啥区别?好用电容笔推荐
  6. 大学体育相关知识/运动学/运动防护
  7. 标准DH建模与改进DH建模
  8. 国产UOS比肩Win10?统信软件放言:要做中国的微软
  9. 动态规划法在汽车租赁问题中的实战(使用策略迭代法得到最优策略和最优价值 python实现 附源码)
  10. 如何在自己电脑上建网站