先介绍一下,ContentProvider可以进行应用间的数据交换,即向其他应用暴露自己想暴露的数据。
实际应用中大多数情况下应该是使用Android系统自带的内容提供者来向Android自带的数据库(短信,联系人,通话记录等等)进行操作。
(一)先给大家介绍一个简单的内容提供者的实现及使用。
1 需要建立一自己的Provider 继承ContentProvider
下面是自己的一个AccountProviderr的实现:
只实现了一个查询的方法
package com.example.day09_pracontentprovider; 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 AccountProviderr extends ContentProvider{ private MyOpenHelper myOpenHelper; //自定义的数据库 private static final int QUERYSUCCESS = 0; //定义的常量用来匹配要进行的操作 // 1 路径匹配器 private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH); // 2 静态代码块 添加匹配规则 static{ // url http://www.baidu.com // uri: com.zyf.provider/query sURIMatcher.addURI("com.zyf.provider", "query", QUERYSUCCESS); } @Override public boolean onCreate() { myOpenHelper=new MyOpenHelper(getContext()); return false; } @Override public int delete(Uri arg0, String arg1, String[] arg2) { // TODO Auto-generated method stub return 0; } @Override public String getType(Uri arg0) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri arg0, ContentValues arg1) { // TODO Auto-generated method stub return null; } public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { int code=sURIMatcher.match(uri); //获取Uri的匹配码 if (code == QUERYSUCCESS) { //如果匹配 进行查询 返回 查询结果cursor SQLiteDatabase db=myOpenHelper.getReadableDatabase(); Cursor cursor = db.query("info", null, null,null,null, null, null); System.out.println("我是内容提供者的"); return cursor;//Returns:A Cursor object, which is positioned before the first entry. } else{ // 不匹配 返回null return null; } } @Override public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) { // TODO Auto-generated method stub return 0; } }
这里要注意在清单文件中声明自己创建的内容提供者时要将android:exported="true"
android:authorities="com.zyf.provider" android:exported="true">
下面是一个MyOpenHelper类
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class MyOpenHelper extends SQLiteOpenHelper{ public MyOpenHelper(Context context) { super(context, "info.db", null, 1); } @Override public void onCreate(SQLiteDatabase arg0) { arg0.execSQL("create table info (_id integer primary key autoincrement,name varchar(20)," + "phone varchar(20),number varchar(20))"); } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { } }
在另一个应用中使用上面建立的内容提供者
import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.database.Cursor; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Uri uri=Uri.parse("content://com.zyf.provider/query"); Cursor cursor=getContentResolver().query(uri, null, null,null, null); if(cursor !=null && cursor.getCount()>0){ while(cursor.moveToNext()){ String name=cursor.getString(1); String phone=cursor.getString(2); System.out.println("-----name"+name+"------"+phone); } } } }
(二)使用Android系统自带的Provider
使用Android自带的内容提供者其实相当的简单
Uri uri=Uri.parse("content://sms"); //uri在Android的源码中可以查看
ContentValues values=new ContentValues(); values.put("address", "132454854"); values.put("date", System.currentTimeMillis()); values.put("body", "I am message body"); getContentResolver().insert(uri, values);//获取内容提供者并插入
这样几行代码便实现了向你的手机中添加一条信息。
内容有问题请大家告知我,我会在第一时间内进行更改哦