什么是ContentProvider
是所有应用程序之间数据存储和检索的桥梁
作用:将应用程序的私有数据向外提供一个访问的接口, 是基于URI的格式 ,向外提供数据访问的接口
ContentProvider 内容提供者 负责暴露数据 相当于服务器
ContentResolver 内容解析者 负责解析ContentProvider暴露的数据 相当于客户端自定义ContentProvider
1.定义一个类继承ContentProvider,重写父类的六个方法
boolean onCreate() //初始化Provider
Uri insert(Uri uri,ContentValues values)//插入新数据
int delete(Uri uri, String selection, String[] selectionArgs)//删除数据
int update(Uri uri,ContentValues values, String selection, String[] selectionArgs)//更新已存在数据
Cursor query(Uri uri,String[] projection, String selection, String[] selectionArgs,String sortOrder) //返回数据给调用者
String getType(Uri uri) //返回ContentProvider的mime数据
2.声明ContentProvider的唯一标识(小写字母,建议:包名+数据库名)
3.声明访问数据库的Code码(是在CotentProvider暴露数据时使用)
4.定义Uri的匹配器UriMatcher,并且实例化(其他应用程序在通过ContentResolver执行CURD操作时,都需要一个重要的参数Uri,为了顺利提供这个Uri参数,Android系统提供了一个UriMatcher工具类)
private static UriMatcher uriMatcher ;
static
{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.add("唯一标识","路径(建议: 表名)",当前Uri对应的数据库的code码);
}
5.定义一个数据库的帮助类(SQLiteOpenHelper),并在onCreate() 方法中完成数据表的初始
6.在相应的增 删 改 查 方法中, 通过Uri匹配器, 判断当前用户传入的Uri到底是操作那张表的code
7.在清单文件中注册ContentProvider
<provider
android:name="" 说明注册的是哪个CotentProvider (全类名)
android:authorities="" 与CotentProvider中的 唯一标识完全一致
android:exported="" 声明当前应用程序 可以被外部的应用程序访问
/>注意:
ContentProvider是单例模式的,当多个应用程序通过使用ContentResolver来操作使用ContentProvider提供的数据时,ContentResolver调用的数据操作会委托给同一个ContentProvider来处理,这样就能保证数据的一致性。-
实例:
public class UserContentProvider extends ContentProvider {
private DbOpenHelper dbOpenHelper;
//2, 声明ContentProvider组件的唯一表示, 必须是小写的字母
//建议: 应用程序的包名+标识资源的名称 (数据库的名称)
private static final String AUTHORITY = "com.qf.day16_contentprovider_04.qf";
//3, 声明访问数据库中的那些表的code
private static final int CODE_USER = 0;
private static final int CODE_ORDER = 5;
//4, 声明Uri的匹配器, 实例化
private static UriMatcher uriMatcher;
static{
//匹配码 UriMatcher.NO_MATCH : 不匹配任何的Uri
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);//注册的Uri /** * authority CotentProvider 的唯一表示 * path 路径(建议为表名,但是不一定) * code 当前url的匹配码 */ //content://com.qf.day16_contentprovider_04.qf/t_user uriMatcher.addURI(AUTHORITY, "t_user", CODE_USER);//URI //content://com.qf.day16_contentprovider_04.qf/t_order uriMatcher.addURI(AUTHORITY, "t_order", CODE_ORDER); } @Override public boolean onCreate() { // 初始化的工作 //getContext() 得到上下文对象 dbOpenHelper = new DbOpenHelper(getContext()); return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // 查询数据 SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); Cursor curson = null; //通过Uri的匹配器, 判断当前的Uri访问的是那张表 switch (uriMatcher.match(uri)) { case CODE_USER: curson = db.query("t_user", projection, selection, selectionArgs, null, null, sortOrder); break; case CODE_ORDER: curson = db.query("t_order", projection, selection, selectionArgs, null, null, sortOrder); break; } return curson; } @Override public Uri insert(Uri uri, ContentValues values) { // 插入数据 SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); long id = 0 ; if(uriMatcher.match(uri)==CODE_USER) { //向数据库中插入数据后, 返回当前插入数据的id id = db.insert("t_user", null, values); //生成最新的URI 并返回(旧的Uri + id) //content://com.qf.day16_contentprovider_04.qf/t_user/7 return ContentUris.withAppendedId(uri, id); } if(uriMatcher.match(uri) == CODE_ORDER) { id = db.insert("t_order", null, values); return ContentUris.withAppendedId(uri, id); } return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // 删除数据 SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); int count = 0; if(uriMatcher.match(uri) == CODE_USER) { count = db.delete("t_user", selection, selectionArgs); } return count; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // 修改数据 SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); int count = 0; if(uriMatcher.match(uri) == CODE_USER) { count = db.update("t_user", values, selection, selectionArgs); } return count; } @Override public String getType(Uri uri) { // TODO 只实现, 不处理 return null; } }
Android之ContentProvider共享数据
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 本文参考了https://blog.csdn.net/qq_35578940/article/details/52...
- 本篇包含Service、Broadcast以及ContentProvider的常见用法 简介 四大组件,包含了Ac...
- 定义 内容提供者,是Android四大组件之一 作用 进程之间进行数据 交互、共享 ,即跨进程通信 1.内容提供...
- Android 使用ContentProvider在应用间共享数据 在开发的过程中,有时会有需求要实现应用程序之间...
- 1 Android四种数据持久化方式 Android有四种数据持久化方式: SharePreference 轻量...