ContentProvider解析

2024-05-27 06:48
文章标签 解析 contentprovider

本文主要是介绍ContentProvider解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.ContentProvider是什么:
四大组件之一用于共享数据。多个进程间共享数据,可以通过共享文件的方法,而共享文件的话,权限自己怎么控制呢?ContentProvider让开发者能够在拥有读写权限的情况下通过一条地址(比如content://com.fool/tab1)来访问共享数据。

2.应用场景 android 中许多系统软件和应用软件都使用该方式实现数据共享,比如电话本,相片,音乐,短彩信,日程表信息等

3.ContentProvider使用代码
AndroidManifest.xml中

<!--android:authorities 唯一标识,通过这个标识外部应用访问BookProvider,因此必须是唯一的,建议加上包前缀-->
<!--android:permission 如果外界想访问BookProvider就必须添加这个权限-->
<provider
    android:name=".provider.BookProvider"android:authorities="com.ryg.chapter_2.book.provider" android:permission="com.ryg.PROVIDER"android:process=":provider" >
</provider>

辅助数据库类 DbOpenHelper.java

public class DbOpenHelper extends SQLiteOpenHelper {private static final String DB_NAME = "book_provider.db";public static final String BOOK_TABLE_NAME = "book";public static final String USER_TALBE_NAME = "user";private static final int DB_VERSION = 3;private String CREATE_BOOK_TABLE = "CREATE TABLE IF NOT EXISTS "+ BOOK_TABLE_NAME + "(_id INTEGER PRIMARY KEY," + "name TEXT)";private String CREATE_USER_TABLE = "CREATE TABLE IF NOT EXISTS "+ USER_TALBE_NAME + "(_id INTEGER PRIMARY KEY," + "name TEXT,"+ "sex INT)";public DbOpenHelper(Context context) {super(context, DB_NAME, null, DB_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK_TABLE);db.execSQL(CREATE_USER_TABLE);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO ignored}}

BookProvider .java

public class BookProvider extends ContentProvider {private static final String TAG = "BookProvider";public static final String AUTHORITY = "com.ryg.chapter_2.book.provider";public static final Uri BOOK_CONTENT_URI = Uri.parse("content://"+ AUTHORITY + "/book");public static final Uri USER_CONTENT_URI = Uri.parse("content://"+ AUTHORITY + "/user");public static final int BOOK_URI_CODE = 0;public static final int USER_URI_CODE = 1;private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);static {//因为BookProvider对应操作的有两张表,所以通过以下方法让他们关联不同的URI_CODE//再通过getTableName来匹配不同的表sUriMatcher.addURI(AUTHORITY, "book", BOOK_URI_CODE);sUriMatcher.addURI(AUTHORITY, "user", USER_URI_CODE);}private Context mContext;private SQLiteDatabase mDb;@Overridepublic boolean onCreate() {Log.d(TAG, "onCreate, current thread:"+ Thread.currentThread().getName());mContext = getContext();initProviderData();return true;}private void initProviderData() {mDb = new DbOpenHelper(mContext).getWritableDatabase();mDb.execSQL("delete from " + DbOpenHelper.BOOK_TABLE_NAME);mDb.execSQL("delete from " + DbOpenHelper.USER_TALBE_NAME);mDb.execSQL("insert into book values(3,'Android');");mDb.execSQL("insert into book values(4,'Ios');");mDb.execSQL("insert into book values(5,'Html5');");mDb.execSQL("insert into user values(1,'jake',1);");mDb.execSQL("insert into user values(2,'jasmine',0);");}//当该表了数据库中的数据后,需要调用mContext.getContentResolver().notifyChange(uri, null);来//通知外界当前ContentProvider中数据已经改变要观察一个ContentProvider中的数据已经发生改变,可以通过ContentResolver的registerContentObserver和
//    unregisterContentObserver来实现注册和解除注册//Provider的增删改查都是在binder的线程池中进行的@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {Log.d(TAG, "query, current thread:" + Thread.currentThread().getName());String table = getTableName(uri);if (table == null) {throw new IllegalArgumentException("Unsupported URI: " + uri);}return mDb.query(table, projection, selection, selectionArgs, null, null, sortOrder, null);}@Overridepublic String getType(Uri uri) {Log.d(TAG, "getType");return null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {Log.d(TAG, "insert");String table = getTableName(uri);if (table == null) {throw new IllegalArgumentException("Unsupported URI: " + uri);}mDb.insert(table, null, values);mContext.getContentResolver().notifyChange(uri, null);return uri;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {Log.d(TAG, "delete");String table = getTableName(uri);if (table == null) {throw new IllegalArgumentException("Unsupported URI: " + uri);}int count = mDb.delete(table, selection, selectionArgs);if (count > 0) {getContext().getContentResolver().notifyChange(uri, null);}return count;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {Log.d(TAG, "update");String table = getTableName(uri);if (table == null) {throw new IllegalArgumentException("Unsupported URI: " + uri);}int row = mDb.update(table, values, selection, selectionArgs);if (row > 0) {getContext().getContentResolver().notifyChange(uri, null);}return row;}private String getTableName(Uri uri) {String tableName = null;switch (sUriMatcher.match(uri)) {case BOOK_URI_CODE:tableName = DbOpenHelper.BOOK_TABLE_NAME;break;case USER_URI_CODE:tableName = DbOpenHelper.USER_TALBE_NAME;break;default:break;}return tableName;}}

ProviderActivity .java

public class ProviderActivity extends Activity {private static final String TAG = "ProviderActivity";Uri bookUri = Uri.parse("content://com.ryg.chapter_2.book.provider/book");private ContentObserver mObserver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_provider);mObserver = new ContentObserver(new Handler()) {@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);System.out.println("观察到BookContentProvider发生改变");}};getContentResolver().registerContentObserver(bookUri, true, mObserver);ContentValues values = new ContentValues();values.put("_id", 6);values.put("name", "程序设计的艺术");//通过对应的uri就可以对ContentProvider进行操作了getContentResolver().insert(bookUri, values);Cursor bookCursor = getContentResolver().query(bookUri, new String[]{"_id", "name"}, null, null, null);while (bookCursor.moveToNext()) {Book book = new Book();book.bookId = bookCursor.getInt(0);book.bookName = bookCursor.getString(1);Log.d(TAG, "query book:" + book.toString());}bookCursor.close();Uri userUri = Uri.parse("content://com.ryg.chapter_2.book.provider/user");Cursor userCursor = getContentResolver().query(userUri, new String[]{"_id", "name", "sex"}, null, null, null);while (userCursor.moveToNext()) {User user = new User();user.userId = userCursor.getInt(0);user.userName = userCursor.getString(1);user.isMale = userCursor.getInt(2) == 1;Log.d(TAG, "query user:" + user.toString());}userCursor.close();}@Overrideprotected void onDestroy() {super.onDestroy();//记得解除观察防止内存泄漏if (mObserver != null) {getContentResolver().unregisterContentObserver(mObserver);mObserver = null;}}
}

代码中有对应注释.

这篇关于ContentProvider解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1006740

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java JDK Validation 注解解析与使用方法验证

《JavaJDKValidation注解解析与使用方法验证》JakartaValidation提供了一种声明式、标准化的方式来验证Java对象,与框架无关,可以方便地集成到各种Java应用中,... 目录核心概念1. 主要注解基本约束注解其他常用注解2. 核心接口使用方法1. 基本使用添加依赖 (Maven

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二