大家好,小丸子每日一篇总结又开始写啦,Android 四大组件,之前看过很多皮毛来应对面试,终于可以静下心,系统的学习一些入门的东西,这次是看的慕课网学习的,如何利用ContentProvider进行系统联系人的查询与插入,在此感谢老师的讲解。
ContentProvider:
内容提供者,它同时也是存储数据的一种可选择的方式。当我们无法操作其他应用程序的数据的时候,它就可以帮我们解决,因为ContentProvider提供了应用程序之间共享数据的机制。ContentProvider除了系统提供的以外我们也可以自定义,由于丸子还是入门阶段,不是理解的很好,期待以后丸子进阶的时候再来写。
那么系统的ContentProvider都可以给我们提供什么样的数据呢?媒体库、通讯录、通话记录、短信读取。。。。。。等等等等,但是老师说常用的就是列举出来的这几个,我也没怎么用过。
1、ContentProvider提供的方法
ContentProvider是一个抽象类,在自定义的情况下,需要实现以下几个方法:
抽象类:
方法:
<span style="font-size:12px;">public class ContentProviderChild extends ContentProvider {
@Override
public boolean onCreate() {
return false;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return null;
}
@Nullable
@Override
public String getType(Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return 0;
}
}
</span>
正如你所看见的,ContentProvider提供了五种方法,query、getType、insert、delete、update。
query:查询,大家可以看到该方法的返回类型是Cursor 游标,Cursor里面包含了查询到的所有数据条目。
getType:得到类型,返回的是字符串,这是根据Uri拿到该Uri的类型。
insert:插入,返回类型是Uri,向原有数据里面插入新数据。
delete: 删除
update:修改
这里有一些还没有使用过,所以暂且这么介绍,也希望大神在评论下赐教。
2.如何利用ContentProvider查询、插入联系人
<span style="font-size:12px;"> /**
* 插入
*/</span>
<span style="font-size:12px;"> //我们就是通过ContentResolver来进行系统ContentProvider的增删改查哒。。。。。。
ContentResolver contentResolver = getContentResolver();</span>
<span style="font-size:12px;"> //上面的方法介绍可以看到,插入的传入参数,Uri,ContentValues,所以在这里我们先新建一个ContentValues对象
ContentValues values = new ContentValues();</span>
<span style="font-size:12px;"> //这里返回的是Uri类型的参数,为啥要用这个Uri呢?<span style="font-family: Arial, Helvetica, sans-serif;">RawContacts.CONTENT_URI,别问我,规定。。。。。。</span>
Uri uri = contentResolver.insert(RawContacts.CONTENT_URI, values);</span>
<span style="font-size:12px;"> //进行插入操作之后,会生成一个唯一的uri,这里是对其进行解析,生成id
Long raw_contact_id = ContentUris.parseId(uri);</span>
<span style="font-size:12px;"> //我们从这里开始将我们的Values传一些值进去</span>
<span style="font-size:12px;"> values.clear();
values.put(StructuredName.RAW_CONTACT_ID, raw_contact_id);
values.put(StructuredName.DISPLAY_NAME, "东明");
values.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
uri = contentResolver.insert(ContactsContract.Data.CONTENT_URI, values);
values.clear();
values.put(Phone.RAW_CONTACT_ID, raw_contact_id);
values.put(Phone.NUMBER, "1341446627");
values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.TYPE, Phone.TYPE_HOME);
uri = contentResolver.insert(ContactsContract.Data.CONTENT_URI, values);</span>
<span style="font-size:12px;">
/**
* 查询
*/
Cursor cursor = contentResolver.query(Contacts.CONTENT_URI, new String[]{
Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);
//Cursor是一个结果的集合一点要判空,否则会报空指针的异常
if (cursor != null) {
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex(Contacts._ID));
String name = cursor.getString(cursor.getColumnIndex(Contacts.DISPLAY_NAME));
Log.d(TAG, "id:" + id);
Log.d(TAG, "name:" + name);
/**
* 根据ID查询电话号码
*/
Cursor cursor1 = contentResolver.query(Phone.CONTENT_URI, new String[]{Phone.TYPE, Phone.NUMBER}, Phone._ID + "=" + id, null, null);
if (cursor1 != null) {
while (cursor1.moveToNext()) {
int type = cursor1.getInt(cursor1.getColumnIndex(Phone.TYPE));
if (type == Phone.TYPE_HOME) {
Log.d(TAG, "家庭电话:" + cursor1.getString(cursor1.getColumnIndex(Phone.NUMBER)));
} else if (type == Phone.TYPE_MOBILE) {
Log.d(TAG, "手机号码:" + cursor1.getString(cursor1.getColumnIndex(Phone.NUMBER)));
}
}
cursor1.close();
}
/**
* 根据ID查询邮箱
*/
Cursor cursor2 = contentResolver.query(Email.CONTENT_URI, new String[]{Email.TYPE, Email.DATA}, Email.CONTACT_ID + "=" + id, null, null);
if (cursor2 != null) {
while (cursor2.moveToNext()) {
int type = cursor2.getInt(cursor2.getColumnIndex(Email.TYPE));
if (type == Email.TYPE_HOME) {
Log.d(TAG, "家庭邮箱:" + cursor2.getString(cursor2.getColumnIndex(Email.DATA)));
} else if (type == Email.TYPE_WORK) {
Log.d(TAG, "工作邮箱:" + cursor2.getString(cursor2.getColumnIndex(Email.DATA)));
}
}
cursor2.close();
}
}
cursor.close();
}
</span>
一定要记得将游标全部都close。
感觉理解的还不是特别好,明天继续看看相关的,end