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

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St