在B获取A的数据——深入浅出讲ContentProvider

有时候想从B程序中获取一些数据,然后在A中使用,而ContentProvider恰恰提供了这样的功能,实现了数据的共享,当需要用到ContentProvider实现数据的共享,要实现以下几步。

第一步:继承ContentProvider并重写以下的方法

public booleanonCreate()

该方法在ContentProvider创建后就会被调用,Android开机后,ContentProvider在其它应用第一次访问它时才会被创建。

public Uriinsert(Uriuri,ContentValues values)

该方法用于供外部应用往ContentProvider添加数据。

public int delete(Uriuri, String selection,String[]selectionArgs)

该方法用于供外部应用从ContentProvider删除数据。

public int update(Uriuri,ContentValues values, Stringselection, String[]selectionArgs)

该方法用于供外部应用更新ContentProvider中的数据。

public Cursorquery(Uriuri, String[]projection, String selection, String[]selectionArgs, StringsortOrder)

该方法用于供外部应用从ContentProvider中获取数据。

public StringgetType(Uriuri)

该方法用于返回当前Url所代表数据的MIME类型。如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头,例如:要得到所

person记录的Uricontent://com.example.cpdemp.personalprovider/person,那么返回的MIME类型字符串应该为:“vnd.android.cursor.dir/person”。如果要操

作的数

据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头,例如:得到id10person记录,Uri

content://com.example.cpdemo.personalprovider/person/10,那么返回的MIME类型字符串应该为:“vnd.android.cursor.item/person”



第二步:要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider

ContentProvider采用了authorities(主机名/域名)对它进行唯一标

<manifest ....>

    <application android:icon="@drawable/icon"android:label="@string/app_name">

        <providerandroid:name="com.example.cpdemo.contentprovider"android:authorities="com.example.cpdemo.personalprovider"/>

    </application>

</manifest>


</pre><p></p><pre>
name:全路径名称(包名+所在主件名称)
authorities:主机名(包名+功能名)

Uri介绍

Uri代表要操作的数据,它可由下面三个部分组成

A:为Android所规定,固定为  content://
B:我们前面指定的主机名authorities
C:路径是我们要操作的数据,比如

要操作person表中id10的记录,可以构建这样的路径:/person/10

要操作person表中id10的记录的name字段,person/10/name

要操作person表中的所有记录,可以构建这样的路径:/person

要操作xxx表中的记录,可以构建这样的路径:/xxx

当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:

要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name

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

Uri uri =Uri.parse("content://com.example.cpdemo.personalprovider/person")


UriMatcher介绍

UriMatcher是用来操控Uri的工具

(1)

//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码

UriMatcher sMatcher = newUriMatcher(UriMatcher.NO_MATCH);

(2)建立匹配规则

//如果match()方法匹配content://com.example.cpdemo.personalprovider/querry路径,返回匹配码为1

sMatcher.addURI(“com.example.cpdemo.personalprovider/person”, “querry”, 1);//添加需要匹配uri,如果匹配就会返回匹配码

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

第三步:在B中操作A的数据,使用ContentResolver操作ContentProvider中的数据

当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使

Activity提供的getContentResolver()方法。ContentResolver类提供了与ContentProvider类相同签名的四个方法:

public Uriinsert(Uriuri,ContentValues values)

该方法用于往ContentProvider添加数据。

public int delete(Uriuri, String selection,String[]selectionArgs)

该方法用于从ContentProvider删除数据。

public int update(Uriuri,ContentValues values, Stringselection, String[]selectionArgs)

该方法用于更新ContentProvider中的数据。

public Cursorquery(Uriuri, String[]projection, String selection, String[]selectionArgs, StringsortOrder)

该方法用于从ContentProvider中获取数据。

这些方法的第一个参数为Uri,代表要操作的ContentProvider和对其中的什么数据进行操作,假设给定的是:

Uri.parse(“content://com.example.cpdemo.personalprovider/person/10”),那么将会对主机名为com.example.cpdemo.personalproviderContentProvider进行操

作,操作的数据为person表中id10的记录。



下面来看一下如何获取手机中的短信
MainActivity.java
package com.example.readsms;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
	private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv=(TextView) findViewById(R.id.tv_context);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    public void click(View view){
    	//利用内容提供者:中间人获取用户的短信数据
    	ContentResolver reslover=getContentResolver();
    	Uri uri=Uri.parse("content://sms/");
    	Cursor cursor=reslover.query(uri, new String[]{"address","date","body","type"}, null, null, null);
    	StringBuffer sb=new StringBuffer();
    	while(cursor.moveToNext()){
    		String address=cursor.getString(0);
    		String date=cursor.getString(1);
    		String body=cursor.getString(2);
    		String type=cursor.getString(3);
    		System.out.println(address+"--"+date+"--"+body+"--"+type);
    		sb.append(address+"--"+date+"--"+body+"--"+type);
    		sb.append("\n");
    	}
    	cursor.close();
    	tv.setText(sb.toString());
    }
}

布局十分的简单,就一个button和TextView 微笑

这样就大功搞成啦,开开心心写代码~oh


----------------------------晴天_1993----------------------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值