內容提供器詳解
內容提供器概念
內容提供器主要用於不同的應用程式之間實現資料共享的功能,他提供了一套完整的機制允許一個程式訪問另一個程式的資料,同時保證被訪資料的安全性。
內容提供器的用法一般有兩種,一種使用現有的內容提供器來讀取和操作相應的程式中的資料,另一種是建立自己的內容提供器給我們程式的資料提供外部訪問介面。
URI最標準的格式如下:
content://com.example.app.provider/table1
對應的程式的包名為com.example.app
Uri uri = Uri.parse(“content://com.example.app.provider/table1”)
呼叫Uri.prase()方法,可以將內容URI字串解析成Uri物件。
使用Uri物件查詢table1中資料
Cursor cursor = getContentResolver().query(
uri,
projection,
selection,
selectionArgs,
sortOrder);
query | 對應SQL部分 | 描述 |
---|---|---|
uri | from table_name | 指定查詢某個程式下的某一張表 |
projection | select column1,column2 | 指定查詢的列名 |
selection | where column = value | 指定where的約束條件 |
selectionArgs | - | 為where中的佔位符提供具體的值 |
orderBy | order by column1,column2 | 指定查詢結果的排序方式 |
讀取系統聯絡人
public class ProviderActivity extends AppCompatActivity { ListView myView; ArrayAdapter<String> adapter; List<String> myList = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.provider_activity); myView = (ListView)findViewById(R.id.list_item); adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,myList); myView.setAdapter(adapter); if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},1); }else { readContacts(); } } private void readContacts() { Cursor cursor = null; try{ cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null); if(cursor != null) { while(cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); myList.add(name + "\n" + number); } adapter.notifyDataSetChanged(); } }catch (Exception e){ e.printStackTrace(); }finally { if(cursor != null){ cursor.close(); } } } @Override public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults) { switch (requestCode){ case 1: if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ readContacts(); }else{ Toast.makeText(this,"denied the permission",Toast.LENGTH_SHORT).show(); } break; default: } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } }
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},1);
第二個引數是一個String陣列,第三個引數是請求碼便於在onRequestPermissionsResult 方法中根據requestCode進行判斷.
請求許可權後會回撥onRequestPermissionsResult方法,在activity中重寫onRequestPermissionsResult(requestCode,permissions,grantResults)方法 grantResults是int型別的陣列每個值為PackageManager.PERMISSION_GRANTED or PackageManager.PERMISSION_DENIED 分別對應permissions的每個請求.
最後需要在AndroidManifest.xml新增如下許可權
<uses-permission android:name="android.permission.READ_CONTACTS" />