ContentProvider(一)
注册ContentProvider:
<provider
android:name=".provider.UserProvider"
android:authorities="com.rw.contentprovider.provider.UserProvider"
android:exported="true"
></provider>其中authorities是URI中的域名部分,可以随便取,但必须在整个系统中唯一
name和ACtivity一样,告诉虚拟机与之绑定的class
exported指定ContentProvider是否允许被其他应用调用
继承ContentProvider的以下5个方法:
可以根据自己的业务需求,实现相应的方法
以下是自己写的demo,有之前写的DBOpenHelper类的支持
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) { SQLiteDatabase dataBase= this.userDatabase.getReadableDatabase();
switch (USERMATCHER.match(uri)) {
case USER:
long rawId= ContentUris.parseId(uri);
String where="uid="+rawId;
if(selection!=null){
where+=" and "+selection;
}
return dataBase.query("users", projection, where, selectionArgs, null, null,sortOrder); case USERS:
return dataBase.query("users", projection, selection, selectionArgs, null,null, sortOrder);
default:
throw new IllegalArgumentException("this unknown Uri:"+uri.toString()); }
}
public String getType(Uri uri) {
switch (USERMATCHER.match(uri)) {
case USER:
return "vnd.android.cursor.dir/user";
case USERS:
return "vnd.android.cursor.item/user";
default:
throw new IllegalArgumentException("this is unknown Uri:"+uri.toString());
}
}
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase dataBase= this.userDatabase.getWritableDatabase();
switch (USERMATCHER.match(uri)) {
case USER:
throw new IllegalArgumentException("this Uri can not insert a record to Content!");
case USERS:
long rawId=dataBase.insert("users", null, values);
return ContentUris.withAppendedId(uri, rawId);
default:
throw new IllegalArgumentException("this unknown Uri:"+uri.toString());
}
}
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase dataBase= this.userDatabase.getWritableDatabase();
switch (USERMATCHER.match(uri)) {
case USER:
long rawId= ContentUris.parseId(uri);
String where="uid="+rawId;
if(selection!=null){
where+=" and "+selection;
}
return dataBase.delete("users", where, selectionArgs);
case USERS:
return dataBase.delete("users", selection, selectionArgs);
default:
throw new IllegalArgumentException("this unknown Uri:"+uri.toString());
}
}
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
SQLiteDatabase dataBase=userDatabase.getWritableDatabase();
switch (USERMATCHER.match(uri)) {
case USER:
long rawId= ContentUris.parseId(uri);
String where="uid="+rawId;
if(selection!=null){
where+=" and "+selection;
}
return dataBase.update("users", values, where, selectionArgs);
case USERS:
if(selection!=null){
return dataBase.update("users", values, selection, selectionArgs);
}else{
throw new IllegalArgumentException("this Uri con not update record from dataBase");
}
default: throw new IllegalArgumentException("this Uri is unknown:"+uri.toString());
}
}
在使用者使用ContentResolver对数据进行CURD操作时,分别调用了与之对应的的方法,其实其底层也是根据URI获取到了这个ContentProvider,进而将参数传递给ContentProvider中与之对应的方法。以下是其中一类的Code
public final int update(Uri uri, ContentValues values, String where,
String[] selectionArgs) { //在这里根据传入的Uri,获取到一个ContentProvider
IContentProvider provider = acquireProvider(uri);
if (provider == null) {
throw new IllegalArgumentException("Unknown URI " + uri);
}
try {
long startTime = SystemClock.uptimeMillis(); //在这里真正执行ContentProvider的update方法
int rowsUpdated = provider.update(mPackageName, uri, values, where, selectionArgs);
long durationMillis = SystemClock.uptimeMillis() - startTime;
maybeLogUpdateToEventLog(durationMillis, uri, "update", where);
return rowsUpdated;
} catch (RemoteException e) {
// Arbitrary and not worth documenting, as Activity
// Manager will kill this process shortly anyway.
return -1;
} finally {
releaseProvider(provider);
}
}
ContentProvider(一)的更多相关文章
- Android之ContentProvider数据存储
一.ContentProvider保存数据介绍 一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数 ...
- Xamarin.Android之ContentProvider
一.前言 掌握了如何使用SQLiteOpenHelper之后,我们就可以进行下一步的学习.本章我们将会学习如何使用ContentProvider来将数据库方面的操作封装起来,同时它还可以供其他应用访问 ...
- ContentProvider域名替换小工具
开发项目域名想怎么换就怎么换,就是这么任性! 这是一个很有意思的小工具! 这是一个方便开发人员和测试人员的小工具!! 吐槽: 一直在做Android开发,一直总有一个问题存在:做自己公司的apk开发时 ...
- Android开发学习—— ContentProvider内容提供者
* 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的数据库.把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用. Uri:包含一个具有一定格式的字符串的对 ...
- 简单的学习心得:网易云课堂Android开发第六章SQLite与ContentProvider
一.SQLite 1.基本操作: (1)创建数据库:在SQLiteOpenHelper的子类构造器中创建. (2)创建表:在SQLiteOpenHelper的子类onCreate方法中,调用execS ...
- ContentProvider中央档案馆,以及获取联系人电话的示例
Android官方文档介绍的数据存储方式共有五种,sqlite,SharedPreferences,网络存储,外储存储,文件存储,但是这些数据都无法进行共享,那么我们就引入了今天的主角:Content ...
- Android基础 : Android ContentProvider
Android 应用程序通过ContentProvider实现方式统一的数据共享功能. 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activi ...
- 安卓初級教程(3):ContentProvider的運用原理
package com.example.android.provider; import java.util.ArrayList; import java.util.HashMap; import j ...
- Android探索之ContentProvider熟悉而又陌生的组件
前言: 总结这篇文章之前我们先来回顾一下Android Sqlite数据库,参考文章:http://www.cnblogs.com/whoislcj/p/5506294.html,Android程序内 ...
- 四大组件之ContentProvider
前言 ContentProvider作为Android的四大组件之一,是属于需要掌握的基础知识,可能在我们的应用中,对于Activity和Service这两个组件用的很常见,了解的也很多,但是对Con ...
随机推荐
- C#操作Excel的OLEDB方式与COM方式比较
2013-03-15 13:42:54 作者:有理想的码农 在对Excel进行读写操作时,使用微软自身提供的解决方案,有两种(第三方方式除外),分别是OLEDB方式和调用COM组件的方式 ...
- 大一上C语言期末大作业-成绩管理系统
都过了半年的作业了,觉得做过去得留下点什么,所以整理了代码发一下博客. 声明:程序在DevC++下用c文件模式可以正常编译使用.(控制台程序) 程序结构:
- Linux下安装、启动MySQL
启动与停止 1.启动 MySQL安装完成后启动文件mysql在/etc/init.d目录下,在需要启动时运行下面命令即可. [root@localhost mysql]# /etc/init.d/my ...
- UVa532 Dungeon Master 三维迷宫
学习点: scanf可以自动过滤空行 搜索时要先判断是否越界(L R C),再判断其他条件是否满足 bfs搜索时可以在入口处(push时)判断是否达到目标,也可以在出口处(pop时) #i ...
- ZOJ 1151 Word Reversal反转单词 (string字符串处理)
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=151 For each list of words, output a l ...
- 怎么去掉li标签前面的点??
<ul class="list"> <li> </li> <li> </li> </ul> .list li ...
- android访问webservices
/** * 手机号段归属地查询(模拟器.HTC 可以) * * @param phoneSec 手机号段 */ public void getRemoteInfo() { /*String pho ...
- 前端框架Bootstrap
前端框架Bootstrap http://www.bootcss.com/ Bootstrap 编码规范 http://codeguide.bootcss.com/
- jquery中获取当前点击对象
jquery中获取当前点击对象的简单方法就是,在点击事件click中传入event对象 click(function(event)); 调用当前对象就是$(event.target);
- android149 360 程序锁输入密码
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...