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 个表 contacts、raw 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 - 新数据记录添加到错误的联系人的主要内容,如果未能解决你的问题,请参考以下文章