Android - 新数据记录添加到错误的联系人

Posted

技术标签:

【中文标题】Android - 新数据记录添加到错误的联系人【英文标题】:Android - New Data record is added to the wrong contact 【发布时间】:2011-07-06 07:57:01 【问题描述】:

我正在尝试将数据记录添加到已存在的联系人,我使用电话查找找到联系人,我获取联系人 _id 字段,并将 raw_contact_id 设置为 _id 字段的新数据添加。 在某些联系人上它不起作用,它将数据与不同的联系人匹配。 (我认为这与存储在 SIM 卡上的联系人有关)

请指教,也许你有不同的方式来添加数据

代码示例:

LinkedList<Long> lcv = new LinkedList<Long>();
    ContentResolver cr = getContentResolver();
    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
    Cursor c = cr.query(uri, null, null, null, null);
    try 
        while (c.moveToNext()) 
            Uri lookupUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI,
                    c.getString(c.getColumnIndex(PhoneLookup.LOOKUP_KEY)));
            Cursor c2 = getContentResolver().query(lookupUri, new String[]  Contacts._ID, Contacts.DISPLAY_NAME ,
                    null, null, null);
            try 
                if (c2.moveToNext()) 
                    Log.i(TAG, "found: " + c2.getLong(c2.getColumnIndex(Contacts._ID)) + ", " + c2.getString(c2.getColumnIndex(Contacts.DISPLAY_NAME)));
                    lcv.add(c2.getLong(c2.getColumnIndex(Contacts._ID)));
                 else 
                    Log.e(TAG, "failed to lookup");
                
             finally 
                c2.close();
            
        
     finally 
        c.close();
    

    for (Long rawid : lcv) 
                        Cursor c3 = cr.query(RawContacts.CONTENT_URI, null, RawContacts.CONTACT_ID + "=?", new String[] rawid+"", null);
                        if (c3.moveToNext()) 
                            Log.e(TAG,"aaaa: " + c3.getString(c3.getColumnIndex(Contacts.DISPLAY_NAME)));
                         else 
                            Log.e(TAG,"errrrror");
                        

                        ContentValues cv = new ContentValues();
                        cv.put(Data.RAW_CONTACT_ID, rawid + "");
                        cv.put(Data.MIMETYPE, MyMime.MIMETYPE);
                        cv.put(Data.DATA1, "mydata");
                        cv.put(Data.SYNC1, syncvalue);
                        Uri newIns = cr.insert(ContactsContract.Data.CONTENT_URI, cv);
                        Log.i(TAG, "insert: " + newIns + ", " + name);
                    

【问题讨论】:

【参考方案1】:

问题出在您选择 Contacts._ID 并使用此 id 填充 LinkedList lcv 中的数据时。

 Cursor c2 = getContentResolver().query(lookupUri, new String[]  Contacts._ID, Contacts.DISPLAY_NAME ,
                    null, null, null);

您实际上需要RAW_CONTACT_ID

DISPLAY_NAME 可以从联系人database/ContactsContract.Data' OR 'database/ContactsContract.CommonDataKinds.StructuredName' OR 'database/RawContactsEntity 获取。在后两种情况下,您将能够使用RAW_CONTACT_ID 获取DISPLAY_NAME

几个关键指针:

Contacts._ID = Data.CONTACT_ID RawContacts._ID = Data.RAW_CONTACT_ID RawContacts.CONTACT_ID = Contacts._ID RawContactsEntity._ID = RawContacts._ID

听起来很混乱??让我试试……

    联系人数据库分为 3 个表 contactsraw contacts数据。 每个表都包含列 (_ID),这是一个自动递增的主键。 data 表包含所有联系信息,例如电话号码、邮件 ID、地址等。 原始联系人指向实际创建的联系人。因此,我们在添加联系人时使用原始联系人。 用户无法在联系人表中添加任何数据。由于aggregation of contacts,此表中的数据在内部填充。 您的逻辑对某些联系人有效的原因是:联系人的_ID,原始联系人仍然存在相同,直到发生任何联系聚合。假设您添加了两个同名 abc 的联系人。这里 原始联系人 的 _ID 增加两次,而 contacts 的 _ID 只增加一次,因为这两个联系人合并到aggregation of contacts

更多详情请参考this。

在您的案例中获取信息的最佳方法是使用ContactsContract.RawContactsEntity(raw_contacts 表与数据表的外连接)

参考:http://developer.android.com/reference/android/provider/ContactsContract.RawContactsEntity.html

【讨论】:

这是互联网上对此的最佳解释,无需深入了解 ContactsContract 增量意大利面条代码。 “外部密钥”等效项特别有用,因为我发现自己不止一次需要使用内容浏览市场应用程序检查它们 @ieRobot:感谢您的评论! 与联系人同步相关的最佳答案谢谢:) 这里也有一篇很好的文章解释了contact和raw contact的区别:android-contact-id-vs-raw-contact-id.blogspot.jp 有人可以建议在联系人列表中添加应用程序图标。

以上是关于Android - 新数据记录添加到错误的联系人的主要内容,如果未能解决你的问题,请参考以下文章

访问链接到 SQL:为新创建的记录显示错误的数据

如何删除以编程方式添加新联系人时添加的 Android 联系人应用程序中的重复条目?

无法更新或添加新的联系人照片 Android

怎么添加android新建联系人

java 在Android上添加新联系人

android怎么 添加联系人到手机