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 ...
随机推荐
- 连接查询中on and和on where的区别
一.区别 1. and条件是在生成临时表时使用的条件,它不管and中的条件是否为真,都会返回左(或者右)边表中的记录. 2.where条件是在临时表生成好后,再对临时表进行过滤的条件.这时已经没有le ...
- Hibernate 中createQuery与createSQLQuery
本文原址 : http://stta04.javaeye.com/blog/377633 hibernate 中createQuery与createSQLQuery 昨晚帮同事看代码到凌晨2点多,今早 ...
- PHP+MySQL多语句执行<转自wooyun>
发起这个帖子,估计就很多人看到题目就表示不屑了.一直以来PHP+MySQL环境下,无论是写程序或者是注入攻击,是无法多语句执行的,这么广为人知的常识,没理由会有人不知道.可权威就是用来被挑战的,常识也 ...
- linux自己带的apache重新启动
如果是linux自己带的apache的话就使用命令 service httpd start 启动 service httpd stop 关闭 service httpd restart 重新启动 如果 ...
- Linux设备模型分析之kset(基于3.10.1内核)
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 内核版本:3.10.1 一.kset结构定义 kset结构体定义在include/linux/kobject.h ...
- delphi 动态建立WebBrower
//Delphi动态建立WebBrowerunit Main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphi ...
- 从Wolframserver获取DC comics卡通人物数据
背景知识 DC comics是美国时代华纳旗下DC娱乐下属的一个漫绘图书出版商. 超人.蝙蝠侠之类漫画的始作俑者. 在Wolfram的眼下为止3750个PopularCurves数据中(所有下载数据有 ...
- Perl多进程
perl作为一种解释性的语言,非常受广大系统管理员的欢迎,优点么就不多说了,坏处也有不少,比如对线程的支持,就一直不咋地,所以大多数情况下,我们都须要多个进程,来帮助我们完毕工作,闲话少说,上代码. ...
- Android应用程序框架之无边界设计意图
Android的应用框架的外特性空间的描述在SDK文档有十分清楚的描述,Android应用的基本概念,组件生命周期等等有详细的描述.在外特性空间中,Android提供了Activity,Service ...
- pager 命令
https://www.percona.com/blog/2013/01/21/fun-with-the-mysql-pager-command/ Last time I wrote about a ...