gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:15:54 25 4
gpt4 key购买 nike

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

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

代码示例:



LinkedList
    
      lcv = new LinkedList
     
      ();
      
ContentResolver cr = getContentResolver();
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
游标 c = cr.query(uri, null, null, null, null);
尝试 {
而(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 },
空,空,空);
尝试 {
如果(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)));
} 别的 {
Log.e(TAG, "查找失败");
}
} 最后 {
c2.关闭();
}
}
} 最后 {
c.关闭();
}

对于(长 rawid:lcv){
Cursor c3 = cr.query(RawContacts.CONTENT_URI, null, RawContacts.CONTACT_ID + "=?", new String[] {rawid+""}, null);
如果(c3.moveToNext()){
Log.e(TAG,"aaaa: "+ c3.getString(c3.getColumnIndex(Contacts.DISPLAY_NAME)));
} 别的 {
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, "我的数据");
cv.put(Data.SYNC1, 同步值);
Uri newIns = cr.insert(ContactsContract.Data.CONTENT_URI, cv);
Log.i(TAG, "插入: "+ newIns + ", "+ name);
}

最佳答案

问题出在您选择 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' 或 'database/ContactsContract.CommonDataKinds.StructuredName' 或 'database/RawContactsEntity 中获取。在后两种情况下,您将能够使用 RAW_CONTACT_ID

获取 DISPLAY_NAME

几个关键点:

  • Contacts._ID = Data.CONTACT_ID
  • RawContacts._ID = Data.RAW_CONTACT_ID
  • RawContacts.CONTACT_ID = 联系人._ID
  • RawContactsEntity._ID = RawContacts._ID

听起来很困惑??让我试试...

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

引用this了解更多详情。

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

引用:http://developer.android.com/reference/android/provider/ContactsContract.RawContactsEntity.html

关于Android - 新数据记录被添加到错误的联系人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5151885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com