ContactsContract结构解析

ContactsContract表用于存储各种个人数据,如电话号码和电子邮件地址。数据类型是开放的,预定义了一些常见类型,但应用可以添加自定义类型。每个RawContacts表行代表一个账户(如用户的一个Gmail账户)的个人数据集合。Contacts表行聚合一个或多个RawContacts,表示同一个人的数据。当RawContacts中的数据变化时,受影响的聚合联系人会得到相应更新。
170311 guanYu 在图书馆
首先,ContactsContract对应数据库contact2.db,是个模型类。可能第一次遇到这个类的时候,大部分人都会和我一样,以为这是个存电话号码的东西。其实,存电话号码只是它众多功能中一个比较常见且实用的功能。
当然,我也不知道为什么一个主要用来存电话号的东西要做得这么复杂,我猜,大概是想建立vr吧。

进入正题
先看看官方文档吧
  • A row in the ContactsContract.Data table can store any kind of personal data, such as a phone number or email addresses. The set of data kinds that can be stored in this table is open-ended. There is a predefined set of common kinds, but any application can add its own data kinds.
  • A row in the ContactsContract.RawContacts table represents a set of data describi
protected fun addContact(contact: Contact): Struct { val ops = arrayListOf<ContentProviderOperation>() ops += ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null) .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null) .build() ops += ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contact.givenName) .withValue(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, contact.middleName) .withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, contact.familyName) .withValue(ContactsContract.CommonDataKinds.StructuredName.PREFIX, contact.prefix) .withValue(ContactsContract.CommonDataKinds.StructuredName.SUFFIX, contact.suffix).build() ops += ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Note.NOTE, contact.note) .build() ops += ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, contact.company) .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, contact.jobTitle).withYieldAllowed(true) .build() //Phones for (phone in contact.phones) { ops += ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone.value) .withTypeAndLabel(ItemType.phone, phone.label) .build() } //Emails for (email in contact.emails) { ops += ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email.value) .withTypeAndLabel(ItemType.email, email.label) .build() } //Postal addresses for (address in contact.postalAddresses) { ops += ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) .withTypeAndLabel(ItemType.address, address.label) .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, address.street) .withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, address.city) .withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, address.region) .withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, address.postcode) .withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, address.country) .build() } for (date in contact.dates) { ops += ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE) .withTypeAndLabel(ItemType.event, date.label) .withValue(ContactsContract.CommonDataKinds.Event.START_DATE, date.toDateValue()) .build() } for (url in contact.urls) { ops += ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE) .withTypeAndLabel(ItemType.url, url.label) .withValue(ContactsContract.CommonDataKinds.Website.URL, url.value) .build() } val saveResult = context.contentResolver.applyBatch(ContactsContract.AUTHORITY, ops) val contactId = saveResult.first().uri?.lastPathSegment?.toLong() ?: pluginError("invalidId", "Expected a valid id") return getContact(ContactKeys(contactId), withThumbnails = true, photoHighResolution = true) } 逐行注释解析
最新发布
10-25
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值