[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. leecode第二天-使用异或找出数组中的非重复元素

    leecode题目描述如下: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 思路: 最开始想到的是使用排序,排序之后就很容易找到非重复元素了. ...

  2. win7 docker Toolbox 启动Docker Quickstart Terminal 失败!

    解决办法: 在windows下安装docker Toolbox 启动Docker Quickstart Terminal 失败! 主要是用如下文件启动,临时解决,或设置环境变量

  3. 背水一战 Windows 10 (109) - 通知(Tile): 按计划显示 tile 通知, 轮询服务端以更新 tile 通知

    [源码下载] 背水一战 Windows 10 (109) - 通知(Tile): 按计划显示 tile 通知, 轮询服务端以更新 tile 通知 作者:webabcd 介绍背水一战 Windows 1 ...

  4. kaldi 运行voxforge例子

    ---------------------------------------------------------------------------------------------------- ...

  5. Android屏幕相关的概念

    1. 屏幕尺寸 实际的物理尺寸,作为屏幕的对角线测量. 为简单起见,安卓所有的实际屏幕尺寸为四个广义的大小:小,正常,大,和特大. 2. 屏幕密度 一个屏幕的物理区域内像素的数量:通常称为DPI(每英 ...

  6. 【MySQL】当前读、快照读、MVCC

    当前读: select...lock in share mode (共享读锁) select...for update update , delete , insert 当前读, 读取的是最新版本, ...

  7. cpuset

    本文属于内核文档翻译,翻译时没有遵照原文,添加了一些作者的理解,目的不是为了替代内核文档,可以作为阅读内核文档的引子,作者鼓励读者阅读原有的内核文档.原文参考3.10.514内核文档cpuset.tx ...

  8. homebrew 更改镜像,进行成功安装

    在mac系统中,使用homebrew可以很方便的管理包.按照官网的说明执行以下命令时总是报错: /usr/bin/ruby -e "$(curl -fsSL https://raw.gith ...

  9. 解决ionic3 android 运行出现Application Error - The connection to the server was unsuccessful

    在真机上启动ionic3打包成的android APK,启动了很久结果弹出这个问题: Application Error - The connection to the server was unsu ...

  10. mysql 开发基础系列5 字符串函数

    字符串函数 1.  concat (s1,s2,...sn) 连接里面的参数成一个字符串(注意上面写错了函数名称) SELECT CONCAT('ddd','CCC'); 2.  insert(str ...