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的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

利用Python和C++解析gltf文件的示例详解

《利用Python和C++解析gltf文件的示例详解》gltf,全称是GLTransmissionFormat,是一种开放的3D文件格式,Python和C++是两个非常强大的工具,下面我们就来看看如何... 目录什么是gltf文件选择语言的原因安装必要的库解析gltf文件的步骤1. 读取gltf文件2. 提

Java中的runnable 和 callable 区别解析

《Java中的runnable和callable区别解析》Runnable接口用于定义不需要返回结果的任务,而Callable接口可以返回结果并抛出异常,通常与Future结合使用,Runnab... 目录1. Runnable接口1.1 Runnable的定义1.2 Runnable的特点1.3 使用Ru

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

IDEA与JDK、Maven安装配置完整步骤解析

《IDEA与JDK、Maven安装配置完整步骤解析》:本文主要介绍如何安装和配置IDE(IntelliJIDEA),包括IDE的安装步骤、JDK的下载与配置、Maven的安装与配置,以及如何在I... 目录1. IDE安装步骤2.配置操作步骤3. JDK配置下载JDK配置JDK环境变量4. Maven配置下