Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> Android 程序代碼刪除聯系人分組的方法

Android 程序代碼刪除聯系人分組的方法

編輯:初級開發

要刪除某一個分組,其實對於android,比我們想象中的要簡單許多。在這裡只是簡單的說一下用法。

  在操作聯系人的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);

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved