注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

Contact数据模型之EntitySet(EntityDeltaList)  

2011-03-09 16:45:26|  分类: 电话薄 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
com.android.contacts.model.EntitySet在Android 4.0中已经改名为了com.android.contacts.model.EntityDeltaList.
public class EntitySet extends ArrayList<EntityDelta> implements Parcelable
EntitySet扩展自ArrayList<EntityDelta>并实现了Parcelable接口。
EntitySet的数据模型描述
一个存储EntityDeltaArrayList
:一个EntityDelta对应一个RawContact
构造函数:
private EntitySet()
注1:EntitySet的构造函数是私有,外部只能通过它的静态方法fromSinglefromQuery来构造。
注2:关于EntityDelta的更多内容可以参照《Contact数据模型之EntityDelta
主要成员变量
private boolean mSplitRawContacts
表示是否要该集合的RawContact在插入时都对该集合的其他RawContact默认为AggregationExceptions.TYPE_KEEP_SEPARATE
主要静态函数
public static EntitySet fromSingle(EntityDelta delta)
  创建一个EntitySet,并把EntityDelta delta加入其中,然后返回该EntitySet。
public static EntitySet fromQuery(ContentResolver resolver, String selection,String[] selectionArgs, String sortOrder)
 首先创建一个EntitySet,接着从数据库中根据条件从RawContactsEntity.CONTENT_URI查询并返回到RawContacts数据的Cursor再接着用RawContacts.newEntityIterator把Cursor转化为EntityIterator(Entity的迭代器),紧接着对EntityIterator进行遍历,用EntityDelta.fromBefore方法把每个Entity转化为EntityDelta,然后把EntityDelta加入到EntitySet。最后,在遍历完成后,返回EntitySet。
 public static EntitySet mergeAfter(EntitySet local, EntitySet remote)
 用EntitySet remote对EntitySet local进行mergeAfter(操作对EntitySet local和EntitySet remote中主表Id一样的EntitySet进行EntityDelta.mergeAfter操作并返回结果。最后返回新的EntitySet local.
注1:如果EntitySet local为null,这时会创建一个空的EntityDelta以便处理。
注2:mergeAfter操作是针对EntitySet local的,所以他会被改变。
注3:关于EntityDelta.mergeAfter操作的更多内容请参见《Contact数据模型之EntityDelta
public static final Parcelable.Creator<EntityDelta> CREATOR 
:该变量因Parcelable而存在。
主要成员函数
public ArrayList<ContentProviderOperation> buildDiff()
 把所有的EntityDelta转化为ContentProviderOperation放到ArrayList<ContentProviderOperation>。
首先遍历所有的EntityDelta,调用它们的buildAssert生成AssertQuery形的ContentProviderOperation放入ArrayList<ContentProviderOperation>中。然后遍历所有的EntityDelta,使用它们的buildDiff生成相应的ContentProviderOperation放入ArrayList<ContentProviderOperation>中,如果mSplitRawContacts为false,且是插入操作,还需要进行AggregationExceptions.TYPE_KEEP_TOGETHER操作。接着,在遍历完成后,mSplitRawContacts为true,还需要进行AggregationExceptions.TYPE_KEEP_SEPARATE操作,以便EntitySet的所有RAW_CONTACT都在不同的Aggregation上。
:这里的AggregationExceptions.TYPE_KEEP_TOGETHER要求是,如果有一个update的EntityDelta,那么就选择第一个update的EntityDelta,然后所有的insert的EntityDelta都和它进行AggregationExceptions.TYPE_KEEP_TOGETHER操作。
如果没有update的EntityDelta,那么除第一所有的insert的EntityDelta都和insert的第一个EntityDelta进行AggregationExceptions.TYPE_KEEP_TOGETHER操作。
protected Builder beginKeepTogether()
 生成一个AggregationExceptions.TYPE_KEEP_TOGETHER类型的Builder。
private void buildSplitContactDiff(final ArrayList<ContentProviderOperation> diff,int[] backRefs)
 创建对EntitySet上所有EntityDelta所对应的RAW_CONTACT进行AggregationExceptions.TYPE_KEEP_SEPARATE操作的ContentProviderOperation, 并加入到ArrayList<ContentProviderOperation> diff中。
注1:因为有些EntityDelta是insert操作,所以就需要int[] backRefs,里面保存有insert操作的BackReference地址(在ArrayList<ContentProviderOperation>的顺序)
注2:该函数调用了buildSplitContactDiff(ArrayList<ContentProviderOperation> diff, int index1,int index2, int[] backRefs)来实现主要功能。
private void buildSplitContactDiff(ArrayList<ContentProviderOperation> diff, int index1,int index2, int[] backRefs)
 创建对EntitySet位置为int index1和int index2的EntityDelta所对应的RAW_CONTACT进行AggregationExceptions.TYPE_KEEP_SEPARATE操作的ContentProviderOperation, 并加入到ArrayList<ContentProviderOperation> diff中。
 注1:因为位置为int index1和int index2的EntityDelta可能insert操作,所以就需要int[] backRefs,里面保存有insert操作的BackReference地址(在ArrayList<ContentProviderOperation>的顺序)
public long findRawContactId()
需找第一个有RawContacts._ID的EntityDelta,并返回其RawContacts._ID。
public Long getRawContactId(int index)
 需找index位置上的EntityDelta,如果它是isVisible(),则返回其RawContacts._ID,否则返回null。
public EntityDelta getByRawContactId(Long rawContactId)
 返回RawContacts._ID为Long rawContactId的EntityDelta
 public int indexOfRawContactId(Long rawContactId)
返回RawContacts._ID为Long rawContactId的EntityDelta在EntitySet上的位置。
public ValuesDelta getSuperPrimaryEntry(final String mimeType)
 在集合中查找MIME为mimeType的ValuesDelta,如果其中有isSuperPrimary()的ValuesDelta,直接返回它,否则最后返回第一个的isPrimary()的ValuesDelta。如果连isPrimary()的ValuesDelta都没有,则返回第一个ValuesDelta。
public int describeContents()
 返回0.// Nothing special about this parcel
 :该方法来自Parcelable。
public void writeToParcel(Parcel dest, int flags)
  把EntityDelta数据都写到Parcel。
:该方法来自Parcelable。
public void readFromParcel(Parcel source)
 从Parcel source中读取EntityDelta数据。
  评论这张
 
阅读(1155)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017