Android学习笔记七之ContentProvider
更新时间:2023-09-12 09:27:01 阅读量: 综合文库 文档下载
- android开发学习网推荐度:
- 相关推荐
Android学习笔记七之ContentProvider
ContentProvicer简介
Content provider,即是内容提供者或者内容提供商。ContentProvider生命周期
应用安装完成,就会创建完成,手机开机后,第一次被访问时,被创建
只要创建了,只要手机没关机,就会一直存在,类似于在注册表里注册一样 手机关机,才会消失
应用里的数据都可以提供访问.不一定是数据库,在方法里自已定义就可以,但通常是访问数据库 作用
ContentProvider用于不同进程之间传递数据,这也是官方推荐的方式。
当我们想要在自己的应用中访问别的应用的数据,比如获取手机联系人,手机短信等的时候,就需要用到ContentProvider了
当我们自己的应用,需要把自己的一些数据给其它应用进行操作,我们就可以用到contentprovider了。
简单的说,就是Contentprovider为不同应用之间数据共享提供统一的接口。ContentProvider使用表的形式组织数据,所以提供的方法跟表的操作类似,ContentProvider提供如下的方法:
query:查询数据 insert:插入数据 update:更新数据 delete:删除数据
getType:得到数据类型
onCreate:创建数据时调用的回调函数
使用ContentProvider需要一个uri,例如获取手机联系人的uri: content://com.Android.contacts/data/phones
URI解析如下图所示
使用系统提供的ContentProvider
很多时候我们都是使用系统提供的ContentProvider,使用ContentResolver来读取其他应用
的信息,例如读取系统APP,短信,联系人, 手机相册等!例如,我们读取手机联系人
读取手机联系人
package com.example.contentprovider;
import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity; import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getContacts(); }
private void getContacts() {
ContentResolver contentResolver = this.getContentResolver();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; System.out.println(\
Cursor cursor = contentResolver.query(uri, null, null, null, null); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
System.out.println(\ System.out.println(\联系人:\ System.out.println(\电话号码:\
}
cursor.close(); } }
获取手机联系人需要用到系统权限,所以需要在AndroidManifest.xml文件中注册:
这样就可以实现简单的读取手机联系人的效果,下面介绍自定义ContentProvider.
自定义ContentProvider
自定义ContentProvider的步骤如下:
在想要进行数据分享的APP中,创建一个继承ContentProvider的类
实现对应的方法,按照需要进行重写,方法有onCreate()只执行一次,初始化ContentProvider,insert(),delete(),update(),query(),getType()获取ContentProvider数据的MIME类型
在AndroidManifest.xml文件中注册自定义的ContentProvider,至少需要三个属性,name,用于指定ContentProvider的全限定类名;authorities,用于匹配ContentProvider的uri;exported,用于指定是否共享数据,true,共享,false,不共享。 使用UriMatcher,完成uri的匹配
在另外的应用中调用getContentProvider()方法获取到Resolver对象,再进行对应的操作 下面进行代码实现:
创建一个继承ContentProvider的类
package com.example.contentprovider;
import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import android.net.Uri;
import android.support.annotation.Nullable; /**
* Created by Devin on 2016/6/17. */
public class MYContentProvicer extends ContentProvider {
private static UriMatcher mUriMatcher;
private static final String AUTHORITIES = \private static final iwww.sm136.comnt PERSON = 1;
private SQLiteDatabaseOpenHelper mOpenHelper; /**
* 利用静态代码块初始化UriMatcher
* 在UriMatcher中包含了多个Uri,每个Uri代表一种操作
* 当调用UriMatcher.match(Uri uri)方法时就会返回该uri对应的code; */ static {
mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); mUriMatcher.addURI(AUTHORITIES, \} /**
* 初始化方法,只执行一次,完成对ContentProvider的初始化 *
* @return */
@Override
public boolean onCreate() {
mOpenHelper = new SQLiteDatabaseOpenHelper(this.getContext()); return true; } /**
* 查询方法 *
* @param uri * @param strings * @param s
* @param strings1 * @param s1 * @return */
@Nullable @Override
public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) { return null;
} /**
* 获取ContentProvider的MIME类型 *
* @param uri * @return */
@Nullable @Override
public String getType(Uri uri) { return null; } /**
* 插入数据方法 *
* @param uri
* @param contentValues * @return */
@Nullable @Override
public Uri insert(Uri uri, ContentValues contentValues) {
switch (mUriMatcher.match(uri)) { case PERSON:
SQLiteDatabase mDataBase = mOpenHelper.getReadableDatabase(); long rowId = mDataBase.insert(\ if (rowId >= 1) {
//通知数据已经发生改变
getContext().getContentResolver().notifyChange(uri, null); return ContentUris.withAppendedId(uri, rowId); }
break; }
return null; } /**
* 删除数据的方法 *
* @param uri * @param s






正在阅读:
Android学习笔记七之ContentProvider09-12
责令停止违法行为通知书04-16
山东省2013年春季高考电力电子考试试题04-29
中望CAD快捷键01-03
【完整版】2022-2025年中国微电机行业快速做大市场规模策略制定04-08
2017新定额规则对比05-09
财务分析课程复习05-25
- 天大砼方案 - 图文
- 农业科技网络书屋能力提升_玉米错题选
- DNS习题
- 浅议检察官对罪犯谈话的技巧与效果
- 高考语文文言文翻译专题训练
- AB类学科竞赛目录(2015)
- 建筑面积计算新规定(2015最新)
- Revit2012初级工程师题集一
- 十三五项目米线可行性报告
- 2013体育学院党组织建设工作总结
- 2014Revit工程师题库
- 高中数学如何实施研究性学习
- 茶艺表演 中英互译
- 小学音乐湘文艺版 四年级下册 第十一课《(歌表演)脚印》优质课公
- 山西省农村合作经济承包合同管理条例
- 2015年镇江市中考化学一模试题参考答案及评分标准(定稿)
- 统计 题集
- 批评意见清单
- 8潞安集团蒲县黑龙关煤矿矿业公司2
- 鄂教版四年级语文上册复习精要(光谷四小)
- ContentProvider
- Android
- 笔记
- 学习
- 2016-2017学年第一学期德育处工作计划
- 开展扶贫助学活动方案
- 北师大版六年级数学小升初模拟试卷(五)
- 新人教版春季小学四年级数学下册课课练大全之课后习题 - 图文
- 黄帝内经试题
- 自动化监控系统在水利工程的应用
- 2.4《光的折射》教学设计
- AB料工艺性试验方案
- 露天煤业“雨季三防”应急预案
- 2008-2009(1)安徽工业大学线性代数试卷B卷
- 2015-2016学年度人教版pep小学六年级英语上册第六单元测试卷 - 图文
- 三月花大酒店保安部管理手册
- Dnntytx托福词汇――熟词辟义表
- 初中学业水平考试-生物 - 图文
- 浅谈电视对儿童的影响
- 衡水金卷2018届高三5月全国大联考文综地理试题含答案
- 牛津英语必修2 unit2 语法详解与练习
- 仪器分析习题
- 吉林省2016年期货从业资格:股指期货投机与套利交易考试题
- 理论力学试卷及答案-B