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

时间:2011-03-01 08:10:57

标签: android contacts

我正在尝试将数据记录添加到已存在的联系人中,我使用电话查找找到该联系人,我将联系_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);
                    }

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 个答案:

答案 0 :(得分:52)

问题在于您选择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。在后两种情况下,您可以使用DISPLAY_NAME

获取RAW_CONTACT_ID

一些关键指针:

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

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

  1. 联系人数据库分为3个表 联系人 原始联系人 数据 即可。
  2. 每个表都包含列(_ID),这是一个自动递增的主键。
  3. 数据 表包含所有联系信息,如电话号码,邮件ID,地址等。
  4. 原始联系人 指向创建的实际联系人。因此,我们在添加联系人时使用 原始联系人
  5. 用户无法在联系人表格中添加任何数据。由于aggregation of contacts,此表中的数据在内部填充。
  6. 您的逻辑适用于某些联系人的原因是: 联系人 原始联系人 直到发生任何联系聚合为止。假设你添加了两个同名abc的联系人。此处 原始联系人 的_ID会递增两次,而 联系人 的_ID仅会增加一次,因为这两个联系人合并到期到aggregation of contacts
  7. 有关详细信息,请参阅this

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

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