Android联系人【Contacts】模块学结.pdf

上传人:asd****56 文档编号:70323181 上传时间:2023-01-19 格式:PDF 页数:25 大小:254.91KB
返回 下载 相关 举报
Android联系人【Contacts】模块学结.pdf_第1页
第1页 / 共25页
Android联系人【Contacts】模块学结.pdf_第2页
第2页 / 共25页
点击查看更多>>
资源描述

《Android联系人【Contacts】模块学结.pdf》由会员分享,可在线阅读,更多相关《Android联系人【Contacts】模块学结.pdf(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Android 平台联系人模块的学习平台联系人模块的学习作者:作者:njl_1982个人学习总结,仅供学习参考之用,请勿重复转载,谢谢。个人学习总结,仅供学习参考之用,请勿重复转载,谢谢。Android 数据存储方式数据存储方式1.文件方式文件方式J2SE 中提供了标准的文件读写方式,如下:publicclassFileActivityextendsActivityOverridepublicvoidonCreate(BundlesavedInstanceState)/读入文件FileInputStreaminStream=this.openFileInput(android.txt);inS

2、tream.read(buffer);inStream.close();/写出文件FileOutputStreamoutStream=this.openFileOutput(android.txt,Context.MODE_PRIVATE);outStream.write(buffer);outStream.close();数据文件位于/data/data/files 的应用私有目录下。如果希望文件被其他应用操作,可以传入:openFileOutput(android.txt,Context.MODE_WORLD_WRITEABLE);2.SharedPreferencesAndroid 中的

3、 SharedPreferences 类,是一个轻量级存储类,特别适合用于保存软件配置参数。其背后是用 xml 文件存放数据,位于/data/data/shared_prefs 目录下:SharedPreferencessharedPreferences=getSharedPreferences(android,Context.MODE_PRIVATE);Editoreditor=sharedPreferences.edit();/获取编辑器editor.putString(name,Android);editor.putInt(age,4);mit();/提交修改生成的 android.xm

4、l 文件内容如下:Android在 Activity 中可以用 getPreferences(mode)方法操作 SharedPreferences,这个方法默认使用当前类不带包名的类名作为文件的名称,具体见 API。访问 SharedPreferences 中的数据代码如下:SharedPreferencessharedPreferences=getSharedPreferences(android,Context.MODE_PRIVATE);Stringname=sharedPreferences.getString(name,);/第二个参数为缺省值intage=sharedPrefer

5、ences.getInt(age,1);附加:如果要访问其它应用的 SharedPreferences,代码如下:ContextotherAppsContext=createPackageContext(cn.android.action,Context.CONTEXT_IGNORE_SECURITY);SharedPreferencessharedPreferences=otherAppsContext.getSharedPreferences(android,Context.MODE_WORLD_READABLE);/注意此处的 modeStringname=sharedPreferenc

6、es.getString(name,);intage=sharedPreferences.getInt(age,1);3.嵌入式关系型数据库嵌入式关系型数据库 SQLite3.1SQLite 简介简介SQLite3 支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和 BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上 sqlite3 也接受 varchar(n)、char(n)、decimal(p,s)等数据类型,只不过在运算或保存时会转成对应的五种数据类型。SQLite 最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么

7、。例如:可以在 Integer 类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。但有一种情况例外:定义为 INTEGERPRIMARYKEY的字段只能存储 64 位整数,当向这种字段中保存除整数以外的数据时,将会产生错误。另外,SQLite 在解析 CREATETABLE 语句时,会忽略 CREATETABLE 语句中跟在字段名后面的数据类型信息,如下面语句会忽略 name 字段的类型信息:CREATETABLEperson(personidintegerprimarykeyautoincrement,namevarchar(20)SQLite 可以解析大

8、部分标准 SQL【StructuredQueryLanguage】语句:查询语句:select*from 表名 where 条件子句 groupby 分组字句 having.orderby 排序子句。如:select*fromperson select*frompersonorderbyiddescselectnamefrompersongroupbynamehavingcount(*)1分页 SQL 与 mysql 类似,下面 SQL 语句获取 5 条记录,跳过前面 3 条记录:select*fromAccountlimit5offset3 或者:select*fromAccountlimi

9、t3,5插入语句:insertinto 表名(字段列表)values(值列表)。如:insertintoperson(name,age)values(Android,3)更新语句:update 表名 set 字段名=值 where 条件子句。如:updatepersonsetname=Androidwhereid=10删除语句:deletefrom 表名 where 条件子句。如:deletefrompersonwhereid=10其它较复杂的 SQL 语句:/模糊查找select*fromtable1wherefield1like%value1%/多表查询selecttable1.c1tab

10、le2.c2fromtable1,table2wheretable1.c_id=table2.id3.2SQLiteDatabase该类封装了一些操作数据库的 API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为 CRUD)。SQLiteDatabase 的主要方法为 execSQL()和 rawQuery()。execSQL()方法可以执行 insert、delete、update 和 CREATETABLE 之类有更改行为的 SQL 语句;rawQuery()方法可以执行 select 语句。SQL

11、iteDatabasedb=databaseHelper.getWritableDatabase();db.execSQL(insertintoperson(name,age)values(android,4);db.close();SQLiteDatabasedb=.;db.execSQL(insertintoperson(name,age)values(?,?),newObjectanroid,4);db.close();SQLiteDatabase 的 rawQuery()用于执行 select 语句,使用例子如下:SQLiteDatabasedb=.;Cursorcursor=db.r

12、awQuery(“select*fromperson”,null);while(cursor.moveToNext()intpersonid=cursor.getInt(0);/获取第一列的值,第一列的索引从 0 开始Stringname=cursor.getString(1);/获取第二列的值intage=cursor.getInt(2);/获取第三列的值cursor.close();db.close();带占位符参数的 select 语句使用例子如下:Cursor cursor=db.rawQuery(select*from person where name like?and age=?

13、,newString%android%,4);SQLiteDatabase 还专门提供了对应于添加、删除、更新、查询的操作方法,方便用户对数据库进行操作。(1)insertSQLiteDatabasedb=databaseHelper.getWritableDatabase();ContentValuesvalues=newContentValues();values.put(name,安桌);values.put(age,4);longrowid=db.insert(“person”,null,values);/返回新添记录的行号,与主键 id 无关(2)deleteSQLiteDataba

14、sedb=databaseHelper.getWritableDatabase();db.delete(person,personid?,newString2);db.close();(3)updateSQLiteDatabasedb=databaseHelper.getWritableDatabase();ContentValuesvalues=newContentValues();values.put(“name”,“android”);/key 为字段名,value 为值db.update(person,values,personid=?,newString1);db.close();(

15、4)queryquery()方法实际上是把 select 语句拆分成了若干个组成部分,然后作为方法的输入参数:SQLiteDatabasedb=databaseHelper.getWritableDatabase();Cursorcursor=db.query(person,newStringpersonid,name,age,namelike?,newString%android%,null,null,personiddesc,1,2);while(cursor.moveToNext()intpersonid=cursor.getInt(0);/获取第一列的值,第一列的索引从 0 开始Str

16、ingname=cursor.getString(1);/获取第二列的值intage=cursor.getInt(2);/获取第三列的值cursor.close();db.close();上面代码用于从 person 表中查找 name 字段含有“android”的记录,匹配的记录按personid 降序排序,对排序后的结果略过第一条记录,只获取 2 条记录。query(table,columns,selection,selectionArgs,groupBy,having,orderBy,limit)方法各参数的含义:table:表名。相当于 select 语句 from 关键字后面的部分。

17、如果是多表联合查询,可以用逗号将两个表名分开。columns:要查询出来的列名。相当于 select 语句 select 关键字后面的部分。selection:查询条件子句,相当于 select 语句 where 关键字后面的部分,在条件子句允许使用占位符“?”selectionArgs:对应于 selection 语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。groupBy:相当于 select 语句 groupby 关键字后面的部分having:相当于 select 语句 having 关键字后面的部分orderBy:相当于 select 语句 orde

18、rby 关键字后面的部分,如:personiddesc,ageasc;limit:指定偏移量和获取的记录数,相当于 select 语句 limit 关键字后面的部分。(4)transaction使用事务操作 SQLite 数据库SQLiteDatabasedb=.;db.beginTransaction();/开始事务trydb.execSQL(insertintoperson(name,age)values(?,?),newObject安桌,4);db.execSQL(updatepersonsetname=?wherepersonid=?,newObject传智,1);db.setTran

19、sactionSuccessful();/调用此方法会在执行到 endTransaction()时提交当前事务,如果不调用此方法会回滚事务finally db.endTransaction();/由事务的标志决定是提交事务,还是回滚事务 db.close();注:使用事务的好处是可以进行批量操作,提高效率。因为 SQLite 缺省为每个操作启动一个事务,特别地,当事务较多时,将增大开销,降低效率。采用上述方式后,多个操作将只启动一个事务。4.ContentProvider当应用继承 ContentProvider 类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用

20、其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences 共 享 数 据,需 要 使 用 sharedpreferences API 读 写 数 据。而 使 用ContentProvider 共享数据的好处是统一了数据访问方式。4.1 Uri,UriMatcher,ContentUris,TextUtils在 android 中,通常用一个 URL【UniformResourceLocator】来标识一个 ContentProvider,与 URL 相关的类有 Uri,UriMatcher

21、,ContentUris,TextUtils,分述如下:?Uri 主要组成部分:scheme+主机名或 authority+path1)ContentProvider(内容提供者)的scheme已经由Android所规定,scheme为:content:/2)主机名(或叫 Authority)用于唯一标识这个 ContentProvider,外部调用者可以根据这个标识来找到它。3)路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:要操作 person 表中 id 为 10 的记录,可以构建这样的路径:/person/10要操作 person 表中 id 为 10 的

22、记录的 name 字段,person/10/name要操作 person 表中的所有记录,可以构建这样的路径:/person要操作 xxx 表中的记录,可以构建这样的路径:/xxx当然要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:要操作 xml 文件中 person 节点下的 name 节点,可以构建这样的路径:/person/name如果要把一个字符串转换成 Uri,可以使用 Uri 类中的 parse()方法,如下:Uriuri=Uri.parse(content:/cn.android.provider.personprovider/person)?UriMatcher

23、类用于解析和匹配 Uri,它的用法如下:1)注册需要匹配的 Uri 路径以及返回的匹配码,如下:/常量 UriMatcher.NO_MATCH 表示不匹配任何路径的返回码。UriMatcher sMatcher=newUriMatcher(UriMatcher.NO_MATCH);/如果 match()方法匹配 content:/cn.android.provider.personprovider/person 路径,返回匹配码为 1sMatcher.addURI(“cn.android.provider.personprovider”,“person”,1);/如果 match()方法匹配

24、content:/cn.android.provider.personprovider/person/230 路径,返回匹配码为 2sMatcher.addURI(“cn.android.provider.personprovider”,“person/#”,2);/#号为通配符2)对传入的 Uri 进行解析注册完需要匹配的 Uri 后,就可以使用 sMatcher.match(uri)方法对输入的 Uri 进行匹配,如果匹配就返回匹配码,匹配码是调用 addURI()方法传入的第三个参数,假设匹配content:/cn.android.provider.personprovider/pers

25、on 路径,返回的匹配码为 1,代码如下:switch(sMatcher.match(Uri.parse(content:/cn.android.provider.personprovider/person/10)case1:break;case2:break;default:/不匹配 break;?ContentUris 类用于获取 Uri 路径后面的 ID 部分,它有两个比较实用的方法:1)withAppendedId(uri,id)用于为路径加上 ID 部分:Uriuri=Uri.parse(content:/cn.android.provider.personprovider/pers

26、on)UriresultUri=ContentUris.withAppendedId(uri,10);/生成后的 Uri 为:content:/cn.android.provider.personprovider/person/102)parseId(uri)方法用于从路径中获取 ID 部分:Uriuri=Uri.parse(content:/cn.android.provider.personprovider/person/10)longpersonid=ContentUris.parseId(uri);/获取的结果为:104.2 ContentProviderContentProvider

27、 类主要方法的作用:1)publicbooleanonCreate()该方法在 ContentProvider 创建后就会被调用,Android 开机后,ContentProvider 在其它应用第一次访问它时才会被创建。2)publicUriinsert(Uriuri,ContentValuesvalues)该方法用于供外部应用往 ContentProvider 添加数据。3)publicintdelete(Uriuri,Stringselection,StringselectionArgs)该方法用于供外部应用从 ContentProvider 删除数据。4)publicintupdate

28、(Uriuri,ContentValuesvalues,Stringselection,StringselectionArgs)该方法用于供外部应用更新 ContentProvider 中的数据。5)publicCursorquery(Uriuri,Stringprojection,Stringselection,StringselectionArgs,StringsortOrder)该方法用于供外部应用从 ContentProvider 中获取数据。6)publicStringgetType(Uriuri)该方法用于返回当前 Url 所代表数据的 MIME 类型。如果操作的数据属于集合类型,

29、那么 MIME 类型字符串应该以 vnd.android.cursor.dir/开头,例如:要得到所有 person 记录的Uri 为 content:/cn.android.provider.personprovider/person,那么返回的 MIME 类型字符串应该为:“vnd.android.cursor.dir/person”。如果要操作的数据属于非集合类型数据,那么 MIME类型字符串应该以 vnd.android.cursor.item/开头,例如:得到 id 为 10 的 person 记录,Uri为 content:/cn.android.provider.personpr

30、ovider/person/10,那么返回的 MIME 类型字符串应该为:“vnd.android.cursor.item/person”。5.ContentResolver当外部应用需要对 ContentProvider 中的数据进行添加、删除、修改和查询操作时,可以使用 ContentResolver 类来完成,要获取 ContentResolver 对象,可以使用 Activity 提供的getContentResolver()方法。ContentResolver 类提供了与 ContentProvider 类相同签名的四个方法:1)publicUriinsert(Uriuri,Cont

31、entValuesvalues)该方法用于往 ContentProvider 添加数据。2)publicintdelete(Uriuri,Stringselection,StringselectionArgs)该方法用于从 ContentProvider 删除数据。3)publicintupdate(Uriuri,ContentValuesvalues,Stringselection,StringselectionArgs)该方法用于更新 ContentProvider 中的数据。4)publicCursorquery(Uriuri,Stringprojection,Stringselecti

32、on,StringselectionArgs,StringsortOrder)该方法用于从 ContentProvider 中获取数据。注:可以使用 ContentResolver.query()方法或者 Activity.managedQuery()方法都可以查询一个内容提供器。两种方法使用相同的参数序列,而且都返回一个 Cursor 对象。不过,managedQuery()可以让活动自动管理这个游标的生命周期。一个被管理的游标处理所有的细节,比如当活动暂停时卸载自身,而活动重新启动时重新查询它自己。你可以让一个活动开始管理一个尚未被管理的游标对象,通过如下调用:Activity.start

33、ManagingCursor()。Contacts 数据库数据库注:以下参考的是 Android 平台标准。1.Contacts 相关数据表相关数据表1)publicstaticfinalclass ContactsContract.RawContactsUri:RawContacts.CONTENT_URIcolumnrecord1_id3contact_id3aggregation_mode0deleted0times_contacted1last_time_contacted1310284098896starred0custom_ringtonenullsend_to_voicemail

34、0account_namenullaccount_typenullsourceidnullversion2dirty1sync1nullsync2nullsync3nullsync4nullname_verified0phonetic_namenullphonetic_name_style0display_name_source40display_nameNjldisplay_name_altNjlsort_keyNjlsort_key_altNjl2)publicstaticclass ContactsContract.ContactsUri:Contacts.CONTENT_URIcolu

35、mnrecord1_id3lookup0r3463E42photo_idnullin_visible_group1has_phone_number1times_contacted1last_time_contacted1310284098896starred0custom_ringtonenullsend_to_voicemail0contact_presencenullcontact_statusnullcontact_status_tsnullcontact_status_res_packagenullcontact_status_labelnullcontact_status_iconn

36、ullphonetic_namenullphonetic_name_style0display_name_source40display_nameNjldisplay_name_altNjlsort_keyNjlsort_key_altNjl3)publicstaticfinalclass ContactsContract.DataUri:Data.CONTENT_URIcolumnrecord1record2record3record4_id5678mimetypevnd.android.cursor.item/phone_v2vnd.android.cursor.item/phone_v2

37、vnd.android.cursor.item/namevnd.android.cursor.item/email_v2raw_contact_id3333is_primary0000is_super_primary0000data_version0000data1133913975320556 Ndata221Njl2data3nullnullnullnulldata423579319331655065506550data5nullnullnullnulldata6nullnullnullnulldata7nullnullnullnulldata8nullnullnullnulldata9n

38、ullnullnullnulldata10nullnull1nulldata11nullnull0nulldata12nullnullnullnulldata13nullnullnullnulldata14nullnullnullnulldata15nullnullnullnulldata_sync1nullnullnullnulldata_sync2nullnullnullnulldata_sync3nullnullnullnulldata_sync4nullnullnullnullgroup_sourceidnullnullnullnullres_packagenullnullnullnu

39、llstatusnullnullnullnullstatus_tsnullnullnullnullstatus_res_packagenullnullnullnullstatus_labelnullnullnullnullstatus_iconnullnullnullnullmodenullnullnullnullname_verified00004)publicstaticfinalclass ContactsContract.GroupsUri:Groups.CONTENT_URI_idtitlenotessystem_idsummary_countsummary_with_phonesg

40、roup_visibledeletedshould_sync2.Contact 相关相关 UriRawContacts.CONTENT_URIcontent:/com.android.contacts/raw_contactsContacts.CONTENT_URIcontent:/com.android.contacts/contactsContacts.CONTENT_LOOKUP_URIcontent:/com.android.contacts/contacts/lookup/UrilookupUri=Uri.withAppendedPath(Contacts.CONTENT_LOOKU

41、P_URI,lookupKey)/UrilookupUri=getLookupUri(contactId,lookupKey)Contacts.CONTENT_FILTER_URIcontent:/com.android.contacts/contacts/filterContacts.CONTENT_GROUP_URIcontent:/com.android.contacts/contacts/groupContacts.CONTENT_STREQUENT_URIcontent:/com.android.contacts/contacts/strequentContacts.CONTENT_

42、STREQUENT_FILTER_URIcontent:/com.android.contacts/contacts/strequent/filterPhoneLookup.CONTENT_FILTER_URIcontent:/com.android.contacts/phone_lookupData.CONTENT_FILTER_URIcontent:/com.android.contacts/dataGroups.CONTENT_URIcontent:/com.android.contacts/groupsGroups.CONTENT_SUMMARY_URIcontent:/com.and

43、roid.contacts/groups_summaryCommonDataKinds.Phone.CONTENT_URIcontent:/com.android.contacts/data/phonesCommonDataKinds.Phone.CONTENT_FILTER_URIcontent:/com.android.contacts/data/phones/filterCommonDataKinds.Email.CONTENT_URIcontent:/com.android.contacts/data/emailsCommonDataKinds.StructuredPostal.CON

44、TENT_URIcontent:/com.android.contacts/data/postals3.Contacts 相关数据库操作相关数据库操作3.1 Insert/RawContacts 表中插入一行记录ContentValuesvalues=newContentValues();values.put(RawContacts.ACCOUNT_TYPE,accountType);values.put(RawContacts.ACCOUNT_NAME,accountName);UrirawContactUri=getContentResolver().insert(RawContacts.

45、CONTENT_URI,values);longrawContactId=ContentUris.parseId(rawContactUri);/Data 表中插入一行记录values.clear();values.put(Data.RAW_CONTACT_ID,rawContactId);values.put(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE);values.put(StructuredName.DISPLAY_NAME,MikeSullivan);getContentResolver().insert(Data.CONTENT_U

46、RI,values);/采用事务进行批处理操作,提高效率ArrayListops=Lists.newArrayList();.intrawContactInsertIndex=ops.size();ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI).withValue(RawContacts.ACCOUNT_TYPE,accountType).withValue(RawContacts.ACCOUNT_NAME,accountName).build();ops.add(ContentProviderOperat

47、ion.newInsert(Data.CONTENT_URI).withValueBackReference(Data.RAW_CONTACT_ID,rawContactInsertIndex).withValue(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE).withValue(StructuredName.DISPLAY_NAME,MikeSullivan).build();getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);3.2 Query/查询 RawCont

48、acts 表中 CONTACT_ID 为 contactId 的记录Cursorc=getContentResolver().query(RawContacts.CONTENT_URI,newStringRawContacts._ID,RawContacts.CONTACT_ID+=?,newStringString.valueOf(contactId),null);/查询 RawContacts 表中指定的 ACCOUNT_NAME 和 ACCOUNT_TYPE 及 STARRED 为 1 的记录UrirawContactUri=RawContacts.URI.buildUpon().app

49、endQueryParameter(RawContacts.ACCOUNT_NAME,accountName).appendQueryParameter(RawContacts.ACCOUNT_TYPE,accountType).build();Cursorc1=getContentResolver().query(rawContactUri,RawContacts.STARRED+0,null,null,null);/以及未删除的记录Cursorc2=getContentResolver().query(rawContactUri,RawContacts.DELETED+0,null,nul

50、l,null);/带参数的 Uri 的查询方式UrirawContactUri=RawContacts.URI.buildUpon().appendQueryParameter(RawContacts.ACCOUNT_NAME,accountName).appendQueryParameter(RawContacts.ACCOUNT_TYPE,accountType).build();Cursorc1=getContentResolver().query(rawContactUri,RawContacts.STARRED+0,null,null,null);/RawContacts.STARR

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁