Android 四大組件 (四) ContentProvider介紹

來源:互聯網
上載者:User

標籤:情境   builder   stringbu   pack   檔案   set   封裝   manifest   格式   

    ContentProvider雖然與Activity、Service、BroadcastReceiver齊名為Android四大組件。如果你不是特別開發一款與其他APP有資料互動的應用,它的使用頻率遠沒有另外三者高。因為已經介紹了前三大組件,為了完善Android四大組件介紹瞭解,這次補充下ContentProvider介紹。哈哈~一邊在看世界盃,巴西打瑞士。目前巴西1:0。我把所有金幣全壓巴西了~題外話說完,下面簡單介紹下ContentProvider。

一.  ContentProvider簡介和常見使用情境:

    Android的資料存放區方式總共有五種,分別是:Shared Preferences、網路儲存、檔案儲存體、外儲儲存、SQLite。但是我們知道一般這些儲存都只是在單獨的一個應用程式之中達到一個資料的共用,有時候我們需要操作其他應用程式的一些資料,例如我們需要作業系統裡的媒體庫、通訊錄等,這時我們就可能通過ContentProvider來滿足我們的需求了。

  由此我們知道,ContentProvider為儲存和擷取資料提供了統一的介面。ContentProvide對資料進行封裝,不用關心資料存放區的細節。使用表的形式來組織資料。使用ContentProvider可以在不同的應用程式之間共用資料。Android為常見的一些資料提供了預設的ContentProvider(包括音頻、視頻、圖片和通訊錄等)。總結就是: ContentProvider一般為儲存和擷取資料提供統一的介面,可以在不同的應用程式之間共用資料。

二.ContentProvider 常見的幾個類:1.ContentResolver

    Android為我們提供了ContentResolver來統一管理與不同ContentProvider間的操作。

 

調用getContentResolver()來獲得ContentResolver。

ContentResolver是如何來區別不同的ContentProvider的呢?這就涉及到URI(Uniform Resource Identifier)問題。

2.URI

ContentProvider中的URI有固定格式,如:

  

  Authority:授權資訊,用以區別不同的ContentProvider;
  Path:表名,用以區分ContentProvider中不同的資料表;
  Id:Id號,用以區別表中的不同資料;

 

 三.ContentProvider查詢手機通訊錄連絡人資訊樣本:
    private TextView tv_query_contacts;    private TextView tv_info_contacts;    String[] premiss = new String[]{            Manifest.permission.READ_CONTACTS,            Manifest.permission.WRITE_CONTACTS    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tv_info_contacts = findViewById(R.id.tv_info_contacts);        tv_query_contacts = findViewById(R.id.query_contacts);        tv_query_contacts.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                checkPresmissed();            }        });    }    /**     * 查詢手機通訊錄所有連絡人名稱     */    private void queryContacts() {        Uri urlContacts = Uri.parse("content://com.android.contacts/contacts");        ContentResolver contentResolver = getContentResolver();        Cursor cursorsContacts = contentResolver.query(urlContacts, new String[]{ContactsContract.Data._ID}, null, null, null);        StringBuilder stringBuilder = new StringBuilder();        while (cursorsContacts.moveToNext()) {            Uri uriPhone = Uri.parse("content://com.android.contacts/contacts/" + cursorsContacts.getInt(0) + "/data");            Cursor cursorPhone = contentResolver.query(uriPhone, new String[]{ContactsContract.Data.DATA1, ContactsContract.Data.MIMETYPE}, null, null, null);            while (cursorPhone.moveToNext()) {                if(cursorPhone.getString(cursorPhone.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/name")){                    //姓名                    stringBuilder.append(cursorPhone.getString(cursorPhone.getColumnIndex("data1")));                }            }        }        tv_query_contacts.setText("");        tv_info_contacts.setText(stringBuilder.toString());    }    private void checkPresmissed() {        /**         * 第 1 步: 檢查是否有相應的許可權         */        boolean isAllGranted = checkPermissionAllGranted(                new String[]{                        Manifest.permission.READ_CONTACTS,                        Manifest.permission.WRITE_CONTACTS                }        );        // 如果這3個許可權全都擁有, 則直接執行備份代碼        if (isAllGranted) {            queryContacts();        } else {            /**             * 第 2 步: 請求許可權             */            // 一次請求多個許可權, 如果其他有許可權是已經授予的將會自動忽略掉            ActivityCompat.requestPermissions(this, premiss, 11);        }    }    /**     * 檢查是否擁有指定的所有許可權     */    private boolean checkPermissionAllGranted(String[] permissions) {        for (String permission : permissions) {            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {                // 只要有一個許可權沒有被授予, 則直接返回 false                return false;            }        }        return true;    }    //授權回調    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if (requestCode == 11) {            queryContacts();        }    }

  

Android 四大組件 (四) ContentProvider介紹

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.