Contact数据模型之EntitySet(EntityDeltaList)

Contact数据模型之EntitySet(EntityDeltaList)

分类: 电话薄   194人阅读  评论(0)  收藏  举报
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的数据模型描述:
一个存储 EntityDelta ArrayList
注:一个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数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值