0

我读到不同表中的不同条目是通过该表中的 _ID 列链接的。例如,一个联系人可能有一个 _ID = 1 我通过

ContactsContract.Contacts._ID

现在我想读取该联系人的电话号码

Cursor phoneCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId , null, null); 
//...
String number = phoneCursor.getString(phoneCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
String id = phoneCursor.getString(phoneCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone._ID));

这很好用,但我期望的是,如果联系人的 _ID 为 1,则电话号码的 _ID 也是 1,因为它们属于一起,但它们不相等。那么问题来了,Android 是如何匹配这些条目的呢?

谢谢。

4

2 回答 2

1

一个联系人对应 1 个或多个原始联系人。联系人的实际数据存储为

ContactsContract.Contacts.Data

每个数据项都包含它所属的原始联系人的 ID。每个原始联系人都包含其所属联系人的 ID。

因此,给定一个联系人 ID,您可以找到它所代表的原始联系人。获取原始联系人 ID,然后查找此联系人中的数据。

于 2010-11-12T09:33:51.340 回答
0

当您看到数据库表时,您可以获得更多详细信息

据我了解,这是我从使用 sqlite3 db 浏览器查看 android contacts2.db 文件中获得的信息

我创建了一些 6 联系人来测试我的 android 联系人

在联系人表中,_id 和 raw_contact_id 实际上是相同的(这意味着 ContactsContract.Contacts 提供者)

在数据表中,我们使用 mimetype Id 作为 where 条件来获取人的真实详细信息,例如电话号码和电子邮件以及名字和姓氏

在考虑数据表时,使用 raw_contact_id 作为获取特定联系人记录的 where 条件

例如我的 raw_contact_id 是 1

我在 data1 列中有 3 行,包括电子邮件、电话和显示名称

您可能会问,如果我们只需要电话或电子邮件或显示名称怎么办……您将需要 mimetype_id 作为 where 条件

获取电话号码 mimetype_id 为 5 获取 display_name mimetype_id 为 6 获取电子邮件 mimetype_id 为 1

如果您是初学者,您可能无法理解所有这些内容......但是一旦您看到内部表格,您就会得到我告诉您的所有内容

只能通过 contact_id 或 raw_contact_id 访问联系人详细信息,而不是通过每个表中的 _id ..该列用于不同的目的..

你可以看看我在这张图片中所说的 http://img94.imageshack.us/i/tablesxa.jpg

于 2011-01-30T15:05:51.490 回答