先介紹一下,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"
<provider android:name="com.example.day09_pracontentprovider.AccountProviderr" 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);//獲取內容提供者並插入
這樣幾行代碼便實現了向你的手機中添加一條信息。
內容有問題請大家告知我,我會在第一時間內進行更改哦