有时候想从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记录的Uri为content://com.example.cpdemp.personalprovider/person,那么返回的MIME类型字符串应该为:“vnd.android.cursor.dir/person”。如果要操
作的数
据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头,例如:得到id为10的person记录,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>
Uri介绍
要操作person表中id为10的记录,可以构建这样的路径:/person/10
要操作person表中id为10的记录的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.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,如果匹配就会返回匹配码
第三步:在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.personalprovider的ContentProvider进行操
作,操作的数据为person表中id为10的记录。
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----------------------------