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

时间:2017-08-05 20:53:15

标签: android xamarin xamarin.android android-contacts android-contentresolver

我有一个奇怪的问题。我正在尝试根据设备上的手机和/或电子邮件地址删除联系人。我在设备中有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 个答案:

答案 0 :(得分:1)

  

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

您的代码不会删除设备中的所有联系人,而是基于通过电话号码查询,因此所有没有电话号码的联系人都不会被删除。

此外,还有一种更简单的方法可以从设备中删除所有联系人,无需运行查询和删除每个联系人的呼叫,只需一个,这是未经过测试的,但应该可以正常工作,因为选择将匹配所有联系人设备

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

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

  

我在设备的“通知栏”中看到错误:“联系太多   缺失“

SyncProvider负责将服务器更改同步到云,并将云更改为设备。当SyncProvider遇到大量客户端删除时,它会引发一个标记,在它将这些删除同步到云之前,它会通过通知通知用户,点击通知应该询问用户这是否是故意的,以及他是什么/她现在想要做的事情:将删除同步到云端,撤消所有删除操作,不执行任何操作(保留删除操作本地,但不要将它们同步到云端)。