内容提供者的好写的内容比较多,所以分为两章节来写。篇一主要讲如何使用现有的内容提供器来读取和操作相应程序中的数据,也就是getContentResolver。内容可以参考《第一行代码》一起服用效果更佳。学习内容的记录。
一、简介
Content Provider:
主要用于不同程序之间实现数据共享功能,它提供一套完整的机制,允许一个程序访问另外一个程序的数据,同时还保证了数据的安全性。
内容提供者分为两种:
1.使用现有的内容提供器来读取和操作相应程序中的数据(篇目一)
2.创建自己的内容提供器给我们程序的数据提供外部访问的接口
二、ContentResolver的基本用法
对于一个每一个应用程序来说,如果想访问内容提供者的共享数据,一定要借助getContentResolver类,通过Context中的getContentResolver()来获取该类的实例。getContentResolver中提供了一系列方法对数据的CRUD操作如 insert(),update()
delete(),query()。
查询为例
参数uri:是一个对象 有sql的基础应该很容易看懂
Uri uri = Uri.parse("content://com.example.contentprovidertest.provider/book");
//com.example.contentprovidertest 要访问app的路径 book 数据
三、ContentResolver的使用之访问电话簿
public class MainActivity extends AppCompatActivity {
ArrayAdapter<String> adapter;
List<String> contactsList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView contactsView =findViewById(R.id.contacts_view);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,contactsList);
contactsView.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 {
//查询电话联系人的数据
/**
* ContactsContract.CommonDataKinds.Phone类已经帮我们封装好了 电话位置就在CONTENT_URI
* ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME 联系人对于的常量
* */
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null); //访问
if (cursor != null){
while (cursor.moveToNext()){
//获取练习人姓名
@SuppressLint("Range") String displayname = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
//获取手机号
@SuppressLint("Range") String number= cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactsList.add(displayname+"\n"+number);
}
adapter.notifyDataSetChanged();
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (cursor!=null){
cursor.close();
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 1:
if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
readContacts();
}else {
Toast.makeText(this, "不允许", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
}
最后记得添加权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>
这样子就可以访问到数据了
总结
介绍了Android内容提供者ContentProvider之getContentResolver的用法。
tip: 这只是我的一家之言,有错误的地方欢迎指正。