ContactsContract.Data ContactsContract.Contacts.Data ContactsContract.RawContacts.Data 关系

ContactsContract.Data                      

extends Object

implements ContactsContract.DataColumnsWithJoins

Class Overview:

该类中包含一些和原始联系资料相关的数据表常量,数据表中的每一行都用来存储联系信息(如电话号码)和元数据(such as whether it is a work or home number)

Data kinds

Data是一个能保存任何类型的联系数据的普通表,数据的类型存储在指定的行(用MIMETYPE来限定),这决定了每一列的含义(从DATA1到DATA15),
    例如,如果数据类型是Phone.CONTENT_ITEM_TYPE,那么DATA1这一列用来存储phone number,
             如果数据类型是Email.CONTENT_ITEM_TYPE,那么DATA1这一列存储的是email address.
    Sync adapters 和 applications 能够使用它们自己的数据类型

    为了方便,ContactsContract定义了一小部分 预定义 的数据类型,例如       ContactsContract.CommonDataKinds.Phone,ContactsContract.CommonDataKinds.Email
    这些类为DATA1列定义特殊的别名,例如Phone.NUMBER和Data.DATA1是一样的.
    DATA1是一个indexed column,它应该存储(查询时用到最多的)数据,
    如:当某一行用来存储email地址时,DATA1应该用来存储email地址本身,DATA2可以用来存储辅助信息,如email地址的类型(家庭、工作等)
    
    依照惯例, DATA15用来存储BLOBs (binary data),即二进制数据.

    指定account type的sync adapter(同步适配器)必须正确地处理raw contacts中的每一种数据类型. 否则可能导致误用或丢失数据.

    同样地, 你应该避免介绍其他类型账户(other party's account type)中的数据类型。
    例如,如果你添加一行数据"favorite song"到Google account拥有的raw contact中, 它将不会得到服务器的同步,因为Google sync adapter
    不知道怎么处理这种数据类型,所以新的数据类型应该和新的account types一次定义,即new sync adapters.

Batch operations

    Data rows能够执行inserted/updated/deleted等操作,传统的用法为
    insert(Uri, ContentValues),
    update(Uri, ContentValues, String, String[]),
    delete(Uri, String, String[]),最新的基于批处理的操作机制被证明是一种更好的选择,它适用于任何情况.
    所有的一批操作在同一个事务中执行,它能保证phone-side和server-side总是一致的,同时基于批操作的方法效率也更高:
    不仅是因为所有的数据库操作在同一个事务中执行, 在不同的content provider之间发送批处理命令也节省了很多时间。

Operations

Insert

    单独的数据行可以采用传统的插入方法insert(Uri, ContentValues). 多行插入应该采用批处理方式.

    传统插入方法:

     ContentValues values = new ContentValues();
     values.put(Data.RAW_CONTACT_ID, rawContactId);
     values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
     values.put(Phone.NUMBER, "1-800-GOOG-411");
     values.put(Phone.TYPE, Phone.TYPE_CUSTOM);
     values.put(Phone.LABEL, "free directory assistance");
     Uri dataUri = getContentResolver().insert(Data.CONTENT_URI, values);
    

    用ContentProviderOperations来实现:

     ArrayList<ContentProviderOperation> ops = Lists.newArrayList();
     ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
              .withValue(Data.RAW_CONTACT_ID, rawContactId)
              .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
              .withValue(Phone.NUMBER, "1-800-GOOG-411")
              .withValue(Phone.TYPE, Phone.TYPE_CUSTOM)
              .withValue(Phone.LABEL, "free directory assistance")
              .build());
     getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

Update

    和insert一样, update即可以单独插入也可以批量插入, 推荐采用批量更新:

     ArrayList<ContentProviderOperation> ops = Lists.newArrayList();
     ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
              .withSelection(Data._ID + "=?", new String[]{String.valueOf(dataId)})
              .withValue(Email.DATA, "somebody@android.com")
              .build());
     getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    

Delete

    和insert、update一样, 删除既可以采用delete(Uri, String, String[])也可以采用ContentProviderOperation:

     ArrayList<ContentProviderOperation> ops = Lists.newArrayList();
     ops.add(ContentProviderOperation.newDelete(Data.CONTENT_URI)
              .withSelection(Data._ID + "=?", new String[]{String.valueOf(dataId)})
              .build());
     getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    

Query

    查找指定contact的指定MIMETYPE的所有的数据

         Cursor c = getContentResolver().query(Data.CONTENT_URI,
                  new String[] {Data._ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL},
                  Data.CONTACT_ID + "=?" + " AND "
                          + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'",
                  new String[] {String.valueOf(contactId)}, null);
        

    查找指定raw contact的指定MIMETYPE的所有的数据

         Cursor c = getContentResolver().query(Data.CONTENT_URI,
                  new String[] {Data._ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL},
                  Data.RAW_CONTACT_ID + "=?" + " AND "
                          + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'",
                  new String[] {String.valueOf(rawContactId)}, null);
        

    查找指定raw contact的所有数据
        大多数sync adapters想要连同raw contact一起读取它的所有数据行,这里应该使用ContactsContract.RawContactsEntity

    另一方面,大量的批处理操作会让数据库锁住一段时间以避免其他应用程序的访问,也可能导致"Application Not Responding"为了避免数据库被锁住,请确保在批处理操作中插入屈服点(yield points).屈服点知识content provider,在执行下一个操作前,它可以提交已经改变的数据,屈服于其他请求,开启另一个事务并执行,屈服点不会自动提交,除非有另一个请求数据库的操作。通常sync adapter应该在每一个批处理操作队列前插入一个屈服点。请查看withYieldAllowed(boolean).

 

 

ContactsContract.Contacts.Data       extends Object implements BaseColumns ContactsContract.DataColumns

ContactsContract.RawContacts.Data

extends Object implements BaseColumns ContactsContract.DataColumns

Class Overview

单独的raw contact子目录,包含它的 ContactsContract.Data 的所有行. 要访问这个目录需要在 contact URI后面添加CONTENT_DIRECTORY . TODO: deprecate in favor of ContactsContract.RawContacts.Entity .

 

ContactsContract.Contacts.Data

extends Object implements BaseColumns ContactsContract.DataColumns

Class Overview

单独的raw contact子目录,包含所有的有权限的raw contact ContactsContract.Data 行.

 

 

 

 

 

 

 

我们注意到它们实现的接口不同,分别为

ContactsContract.Data                       extends Object  implements ContactsContract.DataColumnsWithJoins
ContactsContract.Contacts.Data        extends Object  implements BaseColumns,ContactsContract.DataColumns
ContactsContract.RawContacts.Data extends Object  implements BaseColumns,ContactsContract.DataColumns

 

ContactsContract.DataColumnsWithJoins,绑定查询 ContactsContract.Data table时返回的所有列.

ContactsContract.DataColumns,ContactsContract.Data table中的所有列


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值