內容提供者ContentProvider與內容接受者ContentResolver的使用詳解

ContentProvider的使用

概念:contentprovider是內容提供者,很明顯,內容提供者就是提供數據的,它是用來將自己的數據暴漏出來,供其他的程序訪問並且進行增刪改查的,同樣的他也是四大組件之一,他的創建也需要在清單文件中聲明,這裏就不詳細的描述了,先簡單的描述一下他的使用方法,


步驟:1,創建類,繼承自contentprovider,

   

    2,創建一個匹配器,用來進行數據訪問時數據的匹配


     3,實現需要實現的方法,這裏的實現的方法就是想要做的事情,並不是全部都要實現,共有六中方法。

4,清單文件中註冊,並寫上權限,權限就是匹配器中的權限,



實現::::::::::::匹配器::::::::::::::::::::::方法判斷::::::::::::::::::::::


創建類:

//繼承並實現六個方法,不需要的可以不操做,他們的參數和sql非常的相似,都是通過佔位符和條件進行約束的,
public class MyProvider extends ContentProvider{// query:查詢//    insert:插入//    update:更新//    delete:刪除//    getType:得到數據類型//    onCreate: private static UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);//初始化匹配器 static{//創建靜態代碼塊,隨着類的加載而加載,聲明週期和類相同,// 給匹配器添加uri用來當做一把鑰匙,別的程序只有符合相應操作的鑰匙匹配纔會打開相應的方法,你可以這麼理解



        //模式可以使任意整數,這裏以1,2爲例,使用#通配符代表任意的表,使用#帶表表中的任意的一行,
//首先:一個標準的uri的寫法是這樣的:content:://com.example.administrator.Myprovider/table1


//        matcher.addURI("權限,這裏你可以寫這個類的包名加類名","訪問的路徑,也就是相應的表名",模式);
 matcher.addURI("com.example.administrator.Myprovider","table1",1); matcher.addURI("com.example.administrator.Myprovider","table1/#",2); }// 有了匹配器,就可以通過匹配器的匹配進行操作了,只要其他程序傳遞過來的uri符合其中的某一個uri就打開某一個uri來共對方使用,否則,對方無法操作,這也保證數據的安全性// 這裏只是通過查詢爲例,其實大同小異,這裏就寫查詢爲例子進行簡單的描述 @Override public boolean onCreate() {
//初始化,只有當程序視圖訪問是纔會被初始化
        return false;
    }

    @Nullable
    @Override//參數:uri標識,確定查詢的列的集合,s,string1兩個用來約束查詢那些行,最後是排序的方式。
    public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
//        先匹配uri,判斷符合哪個
        switch (matcher.match(uri)){
//            如果是1,匹配mode是一的
            case 1:
                
                break;
            //如果是2,符合是2的mode這樣就進行相應的操作即可
            case 2:
                
                break;
        }
        return null;
    }

    @Nullable
    @Override//通過uri返回一個MIME類型的串,這個方法用的不多。
    public String getType(Uri uri) {
        return null;
    }

    @Nullable
    @Override//參數uri標識,插入的內容存放在contentvelues裏,
    public Uri insert(Uri uri, ContentValues contentValues) {
        return null;
    }

    @Override//uri標識,後兩個參數約束刪除的行數
    public int delete(Uri uri, String s, String[] strings) {
        return 0;
    }

    @Override//uri標識,數據源,最後兩個約束更新的那些行行數,和sql非常的相似,都是通過佔位符和條件進行約束的,
    public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {
        return 0;
    }
}

內容就不寫例子了,相信大家一看就會理解,多了反而囉嗦,最後記得在清單中註冊就行了。
<provider
    android:authorities="com.example.administrator.MyProvider"
    android:name=".MyProvider"/>這裏一定要寫明權限,不然會出大事的,哈哈



這樣一看是不是非常的簡單.,既然能夠創建提供者,我們在創建一個接受者看看兩者的關係吧?





創建一個內容接受者(我是這麼叫的,可能大家命名不同,不影響技術交流)contentresover,

首先創建接受着對象,然後就可以通過對象直接調用其中的方法了,只需要將uri對象傳入,再將佔位符和條件等傳入,就能夠直接進行對庫進行操作,前提是uri必須和提供者的一致,現在分析一下上邊的提供者,和下邊的接受者,你發現了什麼???uri是不是一樣呢?現在的你多多少少理解了吧





public class MainActivity extends AppCompatActivity {
    private ContentResolver resolver;
    public static final String URI = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        resolver = getContentResolver();
        Uri uri = Uri.parse("content:://com.example.administrator.Myprovider/table1");
        resolver.delete(uri, "id=?", new String[]{"1"});

    }
}














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