ContentProvider的自定义及SMS和CONTACTS的内容提供者

1.自定义内容提供者

首先创建extends ContentProvider的类

package com.txs.db;

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 BankDBBackdoor extends ContentProvider {

    public static final int SUCCESS = 1;
    /**
     * 创建一个保安,检查uri的规则,如果uri匹配失败 返回-1
     */
    static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    static {
        mUriMatcher.addURI("com.txs.db", "account", SUCCESS);
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int code = mUriMatcher.match(uri);
        if (code == SUCCESS) {
            System.out.println("delete 删除数据");
            MyDBOpenHelper helper = new MyDBOpenHelper(getContext());
            SQLiteDatabase db = helper.getWritableDatabase();
            db.delete("account",selection , selectionArgs);
            //利用内容提供者的解析器,通知内容观察者数据发生了变化
            getContext().getContentResolver().notifyChange(uri, null);
        }else{
            throw new IllegalArgumentException("口令 不正确,滚犊子");
        }
        return 0;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        int code = mUriMatcher.match(uri);
        if (code == SUCCESS) {
            System.out.println("insert 添加数据");
            MyDBOpenHelper helper = new MyDBOpenHelper(getContext());
            SQLiteDatabase db = helper.getWritableDatabase();
            db.insert("account", null, values);
            //利用内容提供者的解析器,通知内容观察者数据发生了变化
            getContext().getContentResolver().notifyChange(uri, null);
        }else{
            throw new IllegalArgumentException("口令 不正确,滚犊子");
        }
        return null;
    }

    @Override
    public boolean onCreate() {
        return false;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        int code = mUriMatcher.match(uri);
        if (code == SUCCESS) {
            System.out.println("query 查询数据");
            MyDBOpenHelper helper = new MyDBOpenHelper(getContext());
            SQLiteDatabase db = helper.getReadableDatabase();
            return db.query("account", projection, selection, selectionArgs, null, null, sortOrder);
        }else{
            throw new IllegalArgumentException("口令 不正确,滚犊子");
        }
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        int code = mUriMatcher.match(uri);
        if (code == SUCCESS) {
            System.out.println("update 更新数据");
            MyDBOpenHelper helper = new MyDBOpenHelper(getContext());
            SQLiteDatabase db = helper.getWritableDatabase();
            db.update("account", values, selection, selectionArgs);
            //利用内容提供者的解析器,通知内容观察者数据发生了变化
            getContext().getContentResolver().notifyChange(uri, null);
        }else{
            throw new IllegalArgumentException("口令 不正确,滚犊子");
        }
        return 0;
    }

}

ManiFest清单注册内容提供者

<provider
            android:name="com.txs.db.BankDBBackdoor"
            android:authorities="com.txs.db" >
        </provider>

使用contentRsolver解析contentProvider

ContentResolver resolver = getContentResolver();
        Uri uri = Uri.parse("content://com.txs.db/account");//和清单文件中定义的主机名保持一致

SMS通过contentProvider获取数据

Uri uri = Uri.parse("content://sms");//全部的短信
        ContentResolver resolver = getContentResolver();
        ContentValues values = new ContentValues();
        values.put("address", "110");
        values.put("date", System.currentTimeMillis());
        values.put("type", 1);
        values.put("body", "恭喜您被评为见义勇为好市民,敢于扶老太太");
        resolver.insert(uri, values);

Contacts通过contentProvider获取数据

public static List<ContactInfo> getAllContactInfos(Context context) {
        List<ContactInfo> infos = new ArrayList<ContactInfo>();
        ContentResolver resolver = context.getContentResolver();
        // 查询raw_contact表
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        Uri datauri = Uri.parse("content://com.android.contacts/data");
        Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
                null, null, null);
        while (cursor.moveToNext()) {
            String id = cursor.getString(0);

            if (id != null) {
                ContactInfo info = new ContactInfo();
                // 查询data表
                Cursor datacursor = resolver.query(datauri, new String[] {
                        "data1", "mimetype" }, "raw_contact_id=?",
                        new String[] { id }, null);
                while (datacursor.moveToNext()) {
                    String data1 = datacursor.getString(0);
                    String mimetype = datacursor.getString(1);
                    if ("vnd.android.cursor.item/name".equals(mimetype)) {
                        info.setName(data1);
                    } else if ("vnd.android.cursor.item/im".equals(mimetype)) {
                        info.setQq(data1);
                    } else if ("vnd.android.cursor.item/email_v2"
                            .equals(mimetype)) {
                        info.setEmail(data1);
                    } else if ("vnd.android.cursor.item/phone_v2"
                            .equals(mimetype)) {
                        info.setPhone(data1);
                    }
                }
                datacursor.close();
                infos.add(info);
            }
        }
        cursor.close();
        return infos;
    }

其他人的总结:{

二、Uri类简介

Uri代表了要操作的数据,Uri主要包含了两部分信息

①需要操作的ContentProvider

②对ContentProvider中的什么数据进行操作

组成部分

①scheme:ContentProvider的scheme已经由Android所规定为content://

②主机名(Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。建议为公司域名,保持唯一性

③路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定:

要操作person表中id为10的记录

content://cn.xyCompany.providers.personProvider/person/10

要操作person表中id为10的记录的name字段

content://cn.xyCompany.providers.personProvider/person/10/name

要操作person表中的所有记录

content://cn.xyCompany.providers.personProvider/person

要操作的数据不一定来自数据库,也可以是文件等他存储方式,如要操作xml文件中user节点下的name节点

content://cn.xyCompany.providers.personProvider/person/10/name

把一个字符串转换成Uri,可以使用Uri类中的parse()方法

Uri uri = Uri.parse(“content://cn.xyCompany.providers.personProvider/person”)

三、UriMatcher、ContentUris和ContentResolver简介

Uri代表了要操作的数据,所以经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris。掌握它们的使用会便于我们的开发工作。

UriMatcher

用于匹配Uri

①把需要匹配Uri路径全部给注册上

// 常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。

UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

// 若match()方法匹配content://cn.xyCompany.providers.personProvider/person路径则返回匹配码为1

uriMatcher.addURI(“content://cn.xyCompany.providers.personProvider”,”person”, 1);

// 若match()方法匹配content://cn.xyCompany.providers.personProvider/person/10路径则返回匹配码为2

uriMatcher.addURI(“content://cn.xyCompany.providers.personProvider”,”person/#”, 1);

②注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配

ContentUris

ContentUris是对URI的操作类,其中的withAppendedId(uri, id)用于为路径加上ID部分,parseId(uri)方法用于从路径中获取ID部分方法很实用。

Uri insertUri = Uri.parse(“content://cn.xyCompany.providers.personProvider/person” + id);等价于

Uri insertUri = ContentUris.withAppendedId(uri, id);

ContentResolver

当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成。要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法来操作数据。

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-04 03:55:55

ContentProvider的自定义及SMS和CONTACTS的内容提供者的相关文章

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

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

Zabbix自定义、SMS、邮件告警通知

Zabbix告警媒介 Zabbix的触发器到了要发送告警通知的情况下,需要一个之间介质来接收和传递它的消息给我们这些可爱的运维们er,以往通常用Nagios(Nginos有着强大完善的告警机制),用脚本发送邮件或者微信来到达报警.这里的脚本其实就算得上一种媒介了. Zabbix的四种告警媒介 · E-mail 邮件告警(zabbix 3.0后升级了邮件告警客户端,使用起来还是很方便的) · Jabber Jabber有第三方插件,能让Jabber用户和MSN.YahooMessage.ICQ等I

contentprovider 自定义内容提供者

contentprovider 自定义内容提供者步骤; 1.继承contentprovider 2.清单文件配置,包括主机路径配置:content://包名.类名 3.定义URI匹配器,用于匹配uri,若路径不满足条件返回-1. 4.添加匹配规则 5.复写增删改查方法 注意:结果集系统会自动关闭!!!

内容提供者ContentProvider和内容解析者ContentResolver

简介 ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查.关于数据共享,以前我们学习过文件操作模式,知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据.那么,这里为何要使用ContentProvider 对

入门篇:9.组件4:ContentProvider(内容提供者)

android 四大基本组件 的ContentProvider(内容提供者) 这个组件其实就是一个应用进行数据或数据库提供.共享其他应用获取数据的组件,其大致的结构图如下: 其中uri是一个重要的中间媒介. 联系到我们平时用的安卓程序,最常见的就是通讯录.在我们的安卓手机里,通讯录的设计其实是两个程序,其中有一个程序没有用户界面,单纯的存储着联系人信息,并且数据库结构复杂,这也是为了保证数据的安全.另外一个程序就是我们可以看见的通讯录程序.那么第一个程序就是一个ContentProvider,用

Android组件系列----ContentProvider内容提供者

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4108017.html 联系方式:[email protected] [正文] 一.ContentProvider简介: ContentProvider内容提供者(四大组件之一)主要用于在不同的应用程序之间实现数据共享的功能. ContentProvider可以理解为一个Android应用对外开放的

android100 自定义内容提供者

#ContentProvider,就是来操作数据的,增删改查, * 四大组件之一 * 应用的数据库是不允许其他应用访问的 * 内容提供者的作用就是让别的应用访问到你的数据库 * 内容提供者的作用:把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用 *短信联系人都是在数据库里面.mmssms是短信数据库, *短信数据库有短信数据库的内容提供者,联系人数据库有联系人数据库的内容提供者.拿到对应数据库的内容提供者就能够访问对应的数据库数据. ###短信数据库 * sms表 * body

Android四大组件之内容提供者--ContentProvider

Android四大组件之内容提供者--ContentProvider 1,什么是ContentProvider ContentProvider将应用中的数据对其它应用进行共享, 提供增删改查的方法 ContentProvider统一了数据的访问方式,不必针对不同数据类型采取不同的访问策略 ContentProvider将数据封装,只暴露出我们希望提供给其它程序的数据 ContentProvider中可以注册观察者, 监听数据的变化 2,怎么创建 2.1定义类继承ContentProvider,

【Android基础】内容提供者ContentProvider的使用详解

1.什么是ContentProvider 首先,ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用的比较少. ContentProvider为不同的软件之间数据共享,提供统一的接口.也就是说,如果我们想让其他的应用使用我们自己程序内的数据,就可以使用ContentProvider定义一个对外开放的接口,从而使得其他的应用可以使用咱们应用的文件.数据库内存储的信息.当然,自己开发的应用需要给其他应用共享信息的需求可能比较少见,但是在Andro