【问题标题】:Android adding contact to favorites programmatically - starred column does not existsAndroid以编程方式将联系人添加到收藏夹 - 加星标的列不存在
【发布时间】:2018-12-26 15:01:38
【问题描述】:

我一直在尝试以编程方式将一些联系人添加到收藏夹,这是通过将特定联系人的 STARRED 值从 0 更新为 1 来完成的,但是每当我执行查询时,它都会抛出一个 SQLite exception 让我知道 STARRED列不存在。

contactsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        contentValues = new ContentValues();
        contentValues.put(ContactsContract.CommonDataKinds.Phone.STARRED, 1);
        getActivity().getContentResolver()
        .update(ContactsContract.Data.CONTENT_URI, 
            contentValues, 
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+ " = 'Joe Luis'", null);
    }

【问题讨论】:

    标签: android android-contacts contactscontract


    【解决方案1】:

    STARRED 字段是Contacts 表的一部分,而不是Data 不是Phone 表的一部分。 您可以访问 Phone.STARRED,因为对 Data 表的所有查询都支持与 Contacts 表中的某些字段(包括 STARRED)的隐式连接。

    这是正确的代码:

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        contentValues = new ContentValues();
        contentValues.put(Contacts.STARRED, 1);
        getActivity().getContentResolver().update(Contacts.CONTENT_URI, 
            contentValues, 
            Phone.DISPLAY_NAME+ " = 'Joe Luis'", null);
    };
    

    但是请注意,根据显示名称等非唯一项目修改联系人是一种非常糟糕的做法,因为您可能在设备上拥有多个同名联系人,或者您可能会清空 DISPLAY_NAME,这会导致损坏许多联系人。

    相反,您应该始终使用唯一字段 - Contacts._ID - 用作更新的选择,如下所示:

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        long contactId = getContactIdFromPosition(position); // you need to implement this!
    
        contentValues = new ContentValues();
        contentValues.put(Contacts.STARRED, 1);
        getActivity().getContentResolver().update(Contacts.CONTENT_URI, 
            contentValues, Contacts._ID + "=" + contactId, null);
    };
    

    【讨论】:

    • 非常感谢您的帮助,哈哈,以及使用不同字段而不是联系人姓名的好处,我只是出于测试目的使用它:),我按照您的建议做了,而且效果很好完美,谢谢上帝保佑你!!
    【解决方案2】:

    您正在更新联系人的不同位置

    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" = 'Joe Luis'", null);
    

    您应该指向联系人数据字段。在这种情况下ContactsContract.Contacts.Data 不是ContactsContract.CommonDataKinds

    请使用此方法Set Contact to favorite

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      相关资源
      最近更新 更多