前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[android] 内容提供者实现

[android] 内容提供者实现

作者头像
唯一Chat
发布2019-09-10 11:09:48
4090
发布2019-09-10 11:09:48
举报
文章被收录于专栏:陶士涵的菜地陶士涵的菜地

[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();
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-03-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档