学习 Content Provider:
CP本身为一个 abstract Class,不能new 出来,只能extends,即是继承。
如果extends,就一定要Override Class里增删查改等的方法。
作用人如其名,内容提供。这个”内容”,泛指Android系统内的数据,如image,contacts,mp3…..CP将这些数据有系统地管理。
Android 系统里已有一些公开的,属於Content Provider所管理的资料,如Contacts, MediaStore, Calender等。这些API都在android.provider package之下。
你想用这些数据,你必须经过CP。
除了存取系统下的公开数据,她其实还有一个最主要目的:分享数据。其他应用都能用到你的数据。
如果应用不想分享数据,可用SQLite。
如何管理?
CP将一切数据视为table的形式,即是行、列,相似於database。
每一项数据到有相应唯一的URI。
记着,一定要是唯一。
这个URI有特定格式,不能随便起个名字。
如何增删插改CP?
这个就需要另一个Class帮手,ContentResolver,又是一个abstract Class,不能new出来,只能间接得到其object。
ContentResolver CR = getContentResolver();
有object後就做相关操作。
作用都人如其名,内容分析器。但他分析的不是CP,而是分析client的要求。
何谓client?
一个概念是也。CP既然是提供者,那一定要有个服务对象吧。
这个服务对象就叫client,他会提出要求。
CR分析client的要求後,就会根据要求引用CP里的相应方法。
这点很重要,所以当extends CP时,就需要Override Class里增删查改等的方法。
实习:简单得出聊系人名称
虽然是简单的续习,但原来要学的东西还挺多的。单单就是Android 的Contact Provider里Contact的 API构造就是很覆杂…..比我想像中难理解。
-Contact中有三个Table
1.ContactsContract.Contacts
每行是不同人名,由不同的RawContacts组合
2.ContactsContract.RawContacts
每行代表不同个人资料,对应同一个户囗名?
3.ContactsContract.Data,
每行代表每个RawContact的详细资料?
所有基本资料都会不分类型的储存在Data内,如Name,email address,phone Number等等
差不多大部份资料不是在RawContact,而是在Data table内。一行,或多个一行的资料。Data内每一行都会有一个_ID,是对应某一行的RawContact。
就是因为Data内资料大多,不分类型,所以要有特定方法使人容易在大海中找出想要的针。
例如,ContactContract 提供预设分类,将零散资料以特定方式组合一起。例如ContactsContract.CommonDataKinds.Phone, ContactsContract.CommonDataKinds.Email。
这些Class应该都是table的一种?
现阶段还是知道怎麽做就ok了,原因就日後再研究。
千万要记得在AndroidManifest.xml 加上Read Contacts permission,不然就会出现AndroidRuntime Error!!!
<uses-permission android:name="android.permission.READ_CONTACTS" >
</uses-permission>
Code: Copy Reference 3的,只是换了自己喜欢的名字和转了output方法和加上自己的理解。
在AVD输入了人名Contact,然後在Activity执行以下代码。
private void getContacts(){
ContentResolver cr=getContentResolver();
/*
ContactsContract.CommonDataKinds.Phone是一个public static final class,定议了很多constant
它亦都继承了十多个!其他interface的constant,当中的.DISPLAY_NAME和.NUMBER是其中之一。
.CONTENT_URI就是这个table所在。
都是什麽的contants?
记录聊系人的资料和一些Uri....?
*/
Uri uri=ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
/*
用CR的query method。
除了第一个和第五,其馀要传入的数据都有点难理解...
第一个:uri,输入想要查的URI
第二个:projection...?
第三个:selection...?
第四个:selectinoArgs...?
第五个:sortOrder,作用如其名。
*/
Cursor cursor=cr.query(uri, null, null, null, null);
/*
用法和逻辑都很直接。
相信moveToNext是指那pointer自动到下一row,如果是null就传回负值。
getColumnIndex:找出DISPLAY_NAME到底是什麽Col
getString:通过colIndex,知道那位置,然後得出其值
*/
while (cursor.moveToNext()){
String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String num=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Log.d("Name", name);
Log.d("Phone Number", num);
}
cursor.close();
}
结果真的如我想象,能读出联络人名和电话。
Very Good,终踏出第一步。
Reference:
-1.Content Provider & Resolver概念理解。
http://www.androiddesignpatterns.com/2012/06/content-resolvers-and-content-providers.html
-2.深入理解,有空要详细看看。
http://blog.csdn.net/luoshengyang/article/details/6946067
-3.综合基础教程
http://blog.csdn.net/coder_pig/article/details/47858489