編輯:初級開發
在操作聯系人的ContactsProvider2源碼中,
protected int deleteInTransaction(Uri uri, String selection, String[] selectionArgs) {
if (VERBOSE_LOGGING) {
Log.v(TAG, "deleteInTransaction: "; + uri);
}
flushTransactionalChanges();
final boolean callerIsSyncAdapter =
readBooleanQueryParameter(uri, ContactsContract.CALLER_IS_SYNCADAPTER, false);
final int match = sUriMatcher.match(uri);
switch (match) {
......
......
case GROUPS_ID: {
mSyncToNetwork |= !callerIsSyncAdapter;
return deleteGroup(uri, ContentUris.parseId(uri), callerIsSyncAdapter);
}
case GROUPS: {
int numDeletes = 0;
Cursor c = mDb.query(Tables.GROUPS, new String[]{Groups._ID},
appendAccountToSelection(uri, selection), selectionArgs, null, null, null);
try {
while (c.moveToNext()) {
numDeletes += deleteGroup(uri, c.getLong(0), callerIsSyncAdapter);
}
} finally {
c.close();
}
if (numDeletes > 0) {
mSyncToNetwork |= !callerIsSyncAdapter;
}
return numDeletes;
}
default: {
mSyncToNetwork = true;
return mLegacyApiSupport.delete(uri, selection, selectionArgs);
}
}
}
我們可以看到刪除分組的地方是方法deleteGroup(uri, ContentUris.parseId(uri), callerIsSyncAdapter);其中uri就是我們要操作的uri,這裡組是 ContactsContract.Groups.CONTENT_URI,ContentUris.parseId(uri)是要刪除的分組id,而 callerIsSyncAdapter則表示是否是直接刪除Groups表的數據,還是標記該分組的deleted和dirty字段為1來表示已刪除 (實際刪除是在同步聯系人的時候進行的)。
deleteGroup方法源代碼
public int deleteGroup(Uri uri, long groupId, boolean callerIsSyncAdapter) {
mGroupIdCache.clear();
final long groupMembershipMimetypeId = mDbHelper
.getMimeTypeId(GroupMembership.CONTENT_ITEM_TYPE);
mDb.delete(Tables.DATA, DataColumns.MIMETYPE_ID + "="
+ groupMembershipMimetypeId + " AND " + GroupMembership.GROUP_ROW_ID + "=" + groupId, null);
try {
if (callerIsSyncAdapter) {
return mDb.delete(Tables.GROUPS, Groups._ID + "=" + groupId, null);
} else {
mValues.clear();
mValues.put(Groups.DELETED, 1);
mValues.put(Groups.DIRTY, 1);
return mDb.update(Tables.GROUPS, mValues, Groups._ID + "=" +groupId, null);
}
} finally {
mVisibleTouched = true;
}
}
可見,我們雖然提供的uri是Groups.CONTENT_URI,實際上android為我們進行了兩步操作:
1.根據我們提供的分組delId,刪除Data表中的表示分組關系的那條數據,即Data.MIMETYPE是GroupMemberShip.CONTENT_ITEM_TYPE,data1等於delId的那條數據。這樣就刪除了聯系人與該分組的關系。
2.如果callerIsSyncAdapter=true,則刪除Groups表Groups._ID為delId的數據,這樣就刪除了該分組;否則,標記改組數據為已刪除,數據需要同步,實際刪除操作在同步聯系人時進行。
ContentResolver cr = mContext.getContentResolver();
於是,我們刪除一個分組的時候,如果想刪除某一分組關系,可以不提供callerIsSyncAdapter參數(默認為false),表示標記刪除Groups表對應組數據,刪除對應的Data表數據。
cr.delete(Groups.CONTENT_URI,Groups._ID+"="+groupID,null);
提供callerIsSyncAdapter參數,表示表示刪除Groups表對應組數據,刪除對應的Data表數據。
cr.delete(Uri.parse(ContactsContract.RawContacts.CONTENT_URI.toString() +"?" + ContactsContract.CALLER_IS_SYNCADAPTER+"=true"),Groups._ID+"="+groupID,null)
如果要刪除某一個聯系人與某一個分組的關系,根據源代碼只需要這樣做:
cr.delete(DATA.CONTENT_URI, Datas.MIMETYPE + "=" +
GroupMembership.CONTENT_ITEM_TYPE + " AND " +
GroupMembership.GROUP_ROW_ID + "=" groupId, null);
37.LinearLayout8在菜單裡可以動態改變LinearLayout的布局 原布局: 1: <?xml version=1
接上,其實BnMediaPlayerService->onTransact函數的結構也很簡單,就是switch...case...接收不同的請求執行不同的代碼調用
1.android模擬器采用的是開源工程Qemu,Qemu是Linux 下的著名模擬器2. kernel-qemu是內核鏡像3. ramdisk.img是文件系統,如果
GridVIEw[功能]以前提及過GridView 說也是一種AdapterView 和ListVIEw有點像 今天花了時間 用了一些 有點心得 和大家分享分享[思路]