Android內容提供者使用及創建


先介紹一下,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);//獲取內容提供者並插入

這樣幾行代碼便實現了向你的手機中添加一條信息。

內容有問題請大家告知我,我會在第一時間內進行更改哦

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM