笔记:Android-Content Provider

学习 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值