代码之家  ›  专栏  ›  技术社区  ›  SoftSan Jason

Context.ContentResolver。Delete为某些联系人返回0

  •  0
  • SoftSan Jason  · 技术社区  · 7 年前

    我有一个奇怪的问题。我正在尝试从设备中删除基于给定电话和/或电子邮件地址的联系人。我在设备中有150个联系人,所以它删除了大约100个联系人,但其余50个并没有删除。

    我使用以下代码删除联系人(此方法是从循环中调用)。

    public bool DeleteRecord(string phoneNumber, string email)
    {
        var Id = "0";
        var isDeleted = false;
        string lookupKey = string.Empty;
        try
        {
    
        var uri = ContactsContract.Contacts.ContentUri;
        string[] projection = {
            InterfaceConsts.Id,
            InterfaceConsts.DisplayName,
            ContactsContract.Contacts.InterfaceConsts.LookupKey
            };
        var uri1 = Android.Net.Uri.WithAppendedPath(ContactsContract.PhoneLookup.ContentFilterUri, Android.Net.Uri.Encode(phoneNumber));
    
        var cursor = appContext.ContentResolver.Query(uri1, projection, null, null, null);
    
    
        if (cursor.MoveToFirst())
        {
            do
            {
                Id = cursor.GetString(cursor.GetColumnIndex(projection[0]));
    
                if (Id != "0")
                {
                    int idx = cursor.GetColumnIndex(ContactsContract.ContactsColumns.LookupKey);
                    lookupKey = cursor.GetString(idx);
                }
                break;
            } while (cursor.MoveToNext());
            cursor.Close();
        }
        isDeleted = Id != "0";
        if (isDeleted)
        {
            var u = Android.Net.Uri.WithAppendedPath(ContactsContract.Contacts.ContentLookupUri, lookupKey);
            var res = appContext.ContentResolver.Delete(u, "contact_id=" + Id, null);
            return true;
        }
    }
    catch (Exception ex)
    {
        Android.Util.Log.Error("Error:", ex.Message + " " + ex.StackTrace);
    }
    
    
    return false;
    }
    

    所以不确定这里出了什么问题。对此有什么想法吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   marmor    7 年前

    我正在尝试从设备中删除所有联系人

    您的代码不会删除设备中的所有联系人,它基于按电话号码查询,因此不会删除所有没有电话号码的联系人。

    ContentResolver cr = getContentResolver();
    cr.delete(ContactsContract.Contacts.CONTENT_URI, null, null);
    

    (在Android Java API中,您需要转换为Xamarin API,因为我对它们不太熟悉)

    A. SyncProvider 负责将服务器更改同步到云,并将云更改同步到设备。当SyncProvider遇到大量客户端删除时,它会发出一个标志,在将这些删除同步到云端之前,它会通过通知通知用户,单击通知应该询问用户这是否是故意的,以及他/她现在想做什么:将删除同步到云端,撤消所有删除,什么都不做(将删除保持在本地,但不要将它们同步到云端)。