ContentProvider初步笔记

Provider

查阅文档,重点功能是在不同的应用程序之间共享数据,很少去实现它,大部分是使用android内部的Content provider
(一)基本概念
(1)为存储或获取数据提供了统一的接口
(2)可以在不同的应用程序之间共享数据
(3)android 为常见的一些数据提供了 ContentProvider(包括音频图片动画通讯录等)
URI为每一个ContentProvider所共有,用于表示ContentProvider所提供的数据,一个应用对应一个ContentProvider,外部通过CONTENT_URI来获取自身提供的数据(数据模型ContentProvider使用表的形式来组织数据)
ContentProvider提供的函数:
query,insert,update,delete,getType,onCreate
(二)实现ContentProvider过程:
(1)定义CONTENT_URI常量
必须是唯一的 public static final Uri CONTENT_URI = Uri.parse("content://带包名的完整的类名");
(要是存在很多表应为每一个子表定义一个CONTENT_URI,并且表中必须存在一个名为_id的列)
数据类型
读取整个表中的数据:"vnd.android.cursor.dir/名字"、
读取某一个列的数据:"vnd.android.cursor.item/名字"
(2)定义一个类,继承ContentProvider
在其中定义一个UriMatcher对象用于检查URI是否合法,具体实现参看Contact类的ContentPrivider,根据其实现方法自定义一个检查机制
(3)实现query,insert,update,delete,getType,onCreate方法
uriMatcher.match(uri)返回相应的int值
insert方法:
参数: Uri uri ,ContentValues values(键值对)
返回值:Uri(表示干刚使用这个函数所插入的数据)
dh = new DataBaseHelper(getContext(),FirstProviderMetaData.DATABASE_NAME)
SQLiteDatabase db = dh.getWriteDatabase();//获得可写的SQLite数据库
long rowId = db.insert(UserTableMetaData.TABLE_NAME,null,values)//执行查询方法,返回刚插入记录的ID
Uri uri = ContentUris.withAppendId(UserTableMetaData.CONTENT_URI,rowId);//把新生成的ID追加到ContentURI后面
getContext().getContentResolver.notifyChange(insertedUserUri,null);//通知监听器数据已经改变
return  uri
query方法:
参数Uri,projection,selection,selectionArgs,oderBy
返回值:Cursor对象
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();//使用SQLiteQueryBuilder类创建一个查询的语句
qb.setTables(表名);
qb.setProjectionMap(HashMap对象);//将事先添加好的键值对添加到qb子句中
qb.appendWhere(where子句)
(查找函数uri.getPathSegments()的具体功能)
Cursor c = qb.query(db,projection,selection,selectionArgs,null,null,oderBy)
c.setNotificationUri(getContext.getContentResolver(),uri);//通知监听器数据已经查询成功
(4)在AndroidManifest.xml中进行声明
<provider android:name="类名全称"
android:authorities="URI中间的字串"/>
URI中间的字串:如content://authority/名称中的authority
原文地址:https://www.cnblogs.com/Gaojiecai/p/2136887.html