[android] 内容提供者实现

上一节的主机名类似网络上的域名,协议是content://,可以定义一下规则

content://主机名/insert 添加操作

content://主机名/delete 删除操作

content://主机名/query 查询操作

content://主机名/update 修改操作

规则定义好之后,我们需要解析一下这个字符串,系统提供了一个api来匹配这个字符串

UriMatcher类,new出来对象new UriMatcher(code) code是个int,表示未匹配到的返回值,一般使用常量UriMatcher.NO_MATCH是-1,把他定义成静态成员属性。

Uri也可以加个#代表的是数字,使用ContentUris类的parseId()方法取出#的值

定义一个静态代码块来测试一下这个matcher,static{},调用UriMatcher对象的addURI(authorities,path,code)方法,参数authorities是String主机名,path是String操作名,code是int匹配成功的返回值一般定义成常量private static final int增删查改四个常量。这个就是添加一组匹配规则

实现的主要方法

1.onCreate()方法

当内容提供者这个类开启的时候回调此方法,初始化数据库帮助对象如PersonSQLiteHelper

2.query(uri,projection,selection,selectArgs,sortOrder) (参数:Uri对象别人传过来的uri,字段,条件,条件对应的参数,排序)

方法里面调用matcher对象的match(uri)方法,对所传的uri进行匹配,如果成功就返回上面定义的匹配码,匹配成功调用helper对象的getReadableDatabase()方法获取数据库对象,调用db对象的query(table,columns,selection,selectionArgs,groupby,having,orderBy)方法得到Cursor结果集对象,细节db不要close了,框架会自动关闭

3.getType(uri),返回这个uri的mime类型

返回一条数据return “vnd.android.cursor.item”

返回一组数据return “vnd.android.cursor.dir”

测试这个ContentProvider,新建一个应用,得到手机的中间人,通过getContentResolver()方法获取ContentResolver对象

调用ContentResolver对象的query(uri,projection,selection,selectArgs,sortOrder)方法,(参数:Uri对象别人传过来的uri,字段,条件,条件对应的参数,排序),返回Cursor对象。

获取Uri对象,通过Uri类的parse(uriString)方法,参数:content://主机名/操作名

While循环Cursor对象。

测试报错权限问题 清单文件加这个 android:exported="true"

在ddms面板上左侧的进程列表,点击上面工具栏的stop按钮,关闭进程,当我调用ContentProvider的时候,进程会再次开启。

大部分时候,我们都没有机会去写这个ContentProvider,明白这个原理之后,就要进入重点了,当我们要取出联系人的数据,短信的数据,浏览器书签的数据等的时候,我们就需要使用到它了,通过阅读源代码搞明白他们的Uri和需要传入的参数,更好的使用它

内容提供者:

package com.tsh.database;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri; public class PersonDbProvider extends ContentProvider {
private static final int INSERT = 1;
private static final int SELECT = 2;
private static final int DELETE = 3;
private static final int UPDATE = 4;
private static UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
private PersonSQLiteOpenHelper helper;
static{
//增加一组规则
matcher.addURI("com.tsh.database.personprovider", "insert", INSERT);
matcher.addURI("com.tsh.database.personprovider", "select", SELECT);
matcher.addURI("com.tsh.database.personprovider", "delete", DELETE);
matcher.addURI("com.tsh.database.personprovider", "update", UPDATE);
}
//初始化helper
@Override
public boolean onCreate() {
helper=new PersonSQLiteOpenHelper(getContext());
return false;
}
//查询
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
//验证
if(matcher.match(uri)==SELECT){
SQLiteDatabase db=helper.getReadableDatabase();
Cursor cursor=db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
return cursor;
}
return null;
} @Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
} @Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
return null;
} @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
} @Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
} }

测试:

        ContentResolver resolver=getContentResolver();
Uri uri=Uri.parse("content://com.tsh.database.personprovider/select");
Cursor cursor=resolver.query(uri, null, null, null, null);
while(cursor.moveToNext()){
String name=cursor.getString(cursor.getColumnIndex("name"));
System.out.println("name"+name);
}
cursor.close();

[android] 内容提供者实现的更多相关文章

  1. Android 内容提供者的实现

    接着上文<Android 内容提供者简介>进一步实现内容提供者. 每个Content Provider类都使用URI(Universal Resource Identifier,通用资源标 ...

  2. Android 内容提供者简介

    在Android应用中,我们可以使用显式意图(Explicit Intent)来直接访问其他应用的Activity,但是这仅限于Activity的范畴:如果需要使用其他应用的数据,还需要用到另外一种组 ...

  3. Android内容提供者(Content provider)

    使用ContentProvider共享数据 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访 ...

  4. Android内容提供者

    一个应用中的数据库对别人是不会提供直接的访问的,而是提供接口给别人访问,但是一般应用开发的时候都是去获取别人的数据,而不是自己提供数据. 继承ContentProvider: 在Menifest中注册 ...

  5. Android 内容观察者的原理

    拦截短信,比如当发短信的时候,就把短信读取出来,当系统的短信发生变化的时候,大叫一声,把数据发送到公共的消息邮箱里面,我们的应用通过内容观察者观察公共的消息邮箱 获取ContentResolver对象 ...

  6. Android开发学习—— ContentProvider内容提供者

    * 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的数据库.把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用. Uri:包含一个具有一定格式的字符串的对 ...

  7. Android学习---通过内容提供者(ContentProvider)操作另外一个应用私有数据库的内容

    一.什么是ContentProvider? ContentProvider直译过来就是内容提供者,主要作用就是A应用提供接口给B应用调用数据,和之前介绍的sharedPreference和直接开放文件 ...

  8. 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

    1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and ...

  9. Android应用开发基础之九:内容提供者(ContentProvider)

    内容提供者 应用的数据库是不允许其他应用访问的 内容提供者的作用:就是让别的应用访问到你的数据库 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代 ...

随机推荐

  1. 逆向暴力求解 538.D Weird Chess

    11.12.2018 逆向暴力求解 538.D Weird Chess New Point: 没有读好题 越界的情况无法判断,所以输出任何一种就可以 所以他给你的样例输出完全是误导 输出还搞错了~ 输 ...

  2. wxPyhon 的控件(摘抄)

    一.静态文本控件 wx.StaticText(parent, id, label, pos=wx.DefaultPosition,    size=wx.DefaultSize, style=0, n ...

  3. 深入Java集合学习系列:LinkedHashMap的实现原理

    参考下面链接: http://zhangshixi.iteye.com/blog/673789

  4. 手动模拟attach cinder volume的过程

    我们首先启动一台机器,启动的时候attach一个volume 创建一个空的cinder volume root:~# cinder create --display-name emptyvolume1 ...

  5. MySQL 每秒 570000 的写入,如何实现?

    阅读本文大概需要 2.8 分钟. 来源:http://t.cn/E2TbCg5 一.需求 一个朋友接到一个需求,从大数据平台收到一个数据写入在20亿+,需要快速地加载到MySQL中,供第二天业务展示使 ...

  6. kafka扫盲笔记,实战入门

    Kafka作为大数据时代的产物,自有其生存之道.让我们跟随扫盲班的培训,进行大致了解与使用kafka吧.(平时工作有使用不代表就知道kafka了哟) 1. kafka介绍 1.1. 拥有的能力(能干什 ...

  7. Oracle SQL优化器简介

    目录 一.Oracle的优化器 1.1 优化器简介 1.2 SQL执行过程 二.优化器优化方式 2.1 优化器的优化方式 2.2 基于规则的优化器 2.3 基于成本的优化器 三.优化器优化模式 3.1 ...

  8. Testing - 敏捷测试

    敏捷测试(Agile Testing) SM= Scrum Master PO= Product Owner PB= Product Backlog SB= Sprint Backlog Scrum ...

  9. Lombok的@Data、@Setter、@Getter注解没反应问题解决

    在用@Data注解时,没有生成setter/getter方法.百度了一堆都没解决方法,后来用Google查了一下解决了~~~ 使用IDEA需要安装Lombok插件,我这里已经下载好,如果没下载安装点击 ...

  10. 分布式事务之深入理解什么是2PC、3PC及TCC协议?

    导读 在上一篇文章<[分布式事务]基于RocketMQ搭建生产级消息集群?>中给大家介绍了基于RocketMQ如何搭建生产级消息集群.因为本系列文章最终的目的是介绍基于RocketMQ的事 ...