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的构造函数是私有,
外部只能通过它的
静态方法
fromSingle和
fromQuery来构造。
注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数据。