自定義內容提供者

   今天小編利用閒暇時間研究了一下的安卓的四大基本組件之一 ContentProvider(內容提供者),它主要用於在不同的應用程序之間實現數據共享的功能

    ContentProvider可以理解爲一個安卓應用對外開放接口,只要符合它所定義的格式請求,就可以正常訪問執行操作,其他安卓應用程序就尅通過

 ContentResolver對象與ContentProvider同名方法請求下執行。ContentProvider有很多對外可以以訪問的方法,在ContentResolver中都有方法一

一對應。具體方法在下面講解。

     創建自己的內容提供者首先要新建一個類繼承抽象類ContentProvider並重寫其方法,抽象方法如下:

除了onCreate()和getType()方法外,其他的均爲CRUD操作,這些方法中,Uri參數爲與ContentProvider匹配的請求Uri,剩下的參數和SQLite的CRUD操作,基本一致。

在ContentProvider中的CRUD操作中,都會傳遞一個Uri對象,通過這個對象來匹配對應的請求思考到如何確定uri執行那個操作呢,這時候就需要用到一個UriMatcher對象,它用來幫助內容提供者匹配uri,它所匹配的方法也很簡單,就兩個:


  • void addURI(String authority,String path,int code):添加一個Uri匹配項,authority爲AndroidManifest.xml中註冊的ContentProvider中的authority屬性;path爲一個路徑,可以設置通配符,#表示任意數字,*表示任意字符串,code爲自定義的一個Uri代碼。
  • int match(Uri uri):匹配傳遞的Uri,返回addURI()傳遞的code參數。改方法小編沒做大的瞭解。

   理論知識說到這,下面小編用內容提供者實現了簡單的CRUD的操作,具體代碼如下:

   ContentProvider:(提供數據)

ContentProvider:
public class MyLinkman extends ContentProvider {

    private DbHelper db;
    private SQLiteDatabase sqLiteDatabase;
    private UriMatcher uriMatcher;

    @Override
    public boolean onCreate() {
        Log.i("test","onCreate");
        db = new DbHelper(getContext(),"person.db",null,3);
        sqLiteDatabase = db.getReadableDatabase();
        //實例化uri的匹配器
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        //查詢所有
        uriMatcher.addURI("com.example.contentprivoid.MyPerson","linkman",1);//添加匹配規則
        //查詢單個
        uriMatcher.addURI("com.example.contentprivoid.MyPerson","linkman/#",2);//添加匹配規則
        return false;
    }
    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        Log.i("test","query");
        //根據匹配器去匹配
        int type=uriMatcher.match(uri);
        switch (type){
            case 1://查詢所有
                Log.i("test","查詢所有");
                return  sqLiteDatabase.query(false,"person",projection,selection,selectionArgs,null,null,sortOrder,null);
            case 2://查詢單個
                Log.i("test","查詢單個");
               Long id= ContentUris.parseId(uri);
                return  sqLiteDatabase.query(false,"person",projection,"_id=?",new String[]{id+""},null,null,sortOrder,null);
        }
            return null;
    }
    @Nullable
    @Override
    public String getType(Uri uri) {
        Log.i("test","getType");
        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Log.i("test","insert");
        sqLiteDatabase.insert("person",null,values);
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        Log.i("test","delete");
        sqLiteDatabase.delete("person",selection,selectionArgs);
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        Log.i("test","update");
        return sqLiteDatabase.update("person",values,selection,selectionArgs);
    }
}

ContentResolver內容訪問者:

 //控件初始化
       private void initWight() {
          button = (Button) findViewById(R.id.bt_main_button);
          et_main_id = (EditText) findViewById(R.id.et_main_id);//查詢
          et_main_insertname = (EditText) findViewById(R.id.et_main_insertname);
          et_main_insertage = (EditText) findViewById(R.id.et_main_insertage);
           et_main_delete = (EditText) findViewById(R.id.et_main_delete);
           et_main_updateid = (EditText) findViewById(R.id.et_main_updateid);
           et_main_updatename = (EditText) findViewById(R.id.et_main_updatename);
           et_main_updateage = (EditText) findViewById(R.id.et_main_updateage);
           //01直接qurey詢
           //02.http://localhost:8080/xxx.action?=1
           //使用uri匹配器
      }

    //查詢
    public void getData(View view){
        //判斷輸入框是否爲空
        if (TextUtils.isEmpty(et_main_id.getText().toString())){
            uri = Uri.parse("content://com.example.contentprivoid.MyPerson/linkman");
        }else{
            //單詢單個
            String id=et_main_id.getText().toString();
            uri = Uri.parse("content://com.example.contentprivoid.MyPerson/linkman/"+id);
        }
        //訪問數據
        Cursor cursor=cr.query(uri,null,null,null,null);
        while (cursor.moveToNext()){
            int pid=cursor.getInt(cursor.getColumnIndex("_id"));;
            String uname=cursor.getString(cursor.getColumnIndex("name"));
            int age=cursor.getInt(cursor.getColumnIndex("age"));
            Log.i("test",pid+"  "+uname+"  "+age);
        }

    }
    //添加
    public void addlinkman(View view){
        if (TextUtils.isEmpty(et_main_insertname.getText().toString())&&TextUtils.isEmpty(et_main_insertage.getText().toString())){
            Toast.makeText(this,"請填寫完整",Toast.LENGTH_SHORT).show();
        }else{
            String name= et_main_insertname.getText().toString();
            String age=  et_main_insertage.getText().toString();
            ContentValues values=new ContentValues();
            values.put("name",name);
            values.put("age",age);
            uri = Uri.parse("content://com.example.contentprivoid.MyPerson");
            cr.insert(uri,values);
            Toast.makeText(this,"添加成功",Toast.LENGTH_SHORT).show();
        }
    }

    //刪除
    public void deletelinkman(View view){
        String id=et_main_delete.getText().toString();
        uri = Uri.parse("content://com.example.contentprivoid.MyPerson");
        cr.delete(uri,"_id=?",new String[]{id+""});
    }
    //修改
    public void updatelinkman(View view){
        String id=et_main_updateid.getText().toString();
        String name= et_main_updatename.getText().toString();
        String age=  et_main_updateage.getText().toString();
        uri = Uri.parse("content://com.example.contentprivoid.MyPerson");
        ContentValues values=new ContentValues();
        if (TextUtils.isEmpty(et_main_updatename.getText().toString())){

        }else {
            values.put("name",name);
        }
        if (TextUtils.isEmpty(et_main_updateage.getText().toString())){

        }else{
            values.put("age",age);
        }

        int update = cr.update(uri, values, "_id=?", new String[]{id + ""});
        if (update>0){
            Toast.makeText(this,"修改成功",Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this,"修改失敗",Toast.LENGTH_SHORT).show();
        }
    }
基本代碼就這些,清單文件的配置小編就粘貼啦,希望對初學者有幫助。大笑

ok,今天內容提供者就寫到這,下次小編閒暇時間在學習內容提供者啦!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章