Android 内容提供程序。如何通过通讯录中的一个请求获取所有数据

Posted

技术标签:

【中文标题】Android 内容提供程序。如何通过通讯录中的一个请求获取所有数据【英文标题】:Android Content provider. How to get all data by one request from contact book 【发布时间】:2022-01-13 18:30:30 【问题描述】:

是否可以通过一个请求从通讯录中检索所有数据(电话号码、电子邮件、名字、姓氏、照片、缩略图)。现在我正在运行一个单独的名字和姓氏请求,一个单独的电话号码请求和一个单独的电子邮件请求,等等。是否可以在一个请求中获取所有这些数据?请帮帮我。

【问题讨论】:

当然。作为 query() 的结果,您可以根据需要在矩阵光标中放置任意数量的行(包含任意数量的字段)。 我知道锄头来传递数据。我不知道如何从通讯录中检索所有数据。你的问题不清楚。有什么问题? 【参考方案1】:

是的,你可以。

您可能正在对别名表(例如 CommonDataKinds.PhoneCommonDataKinds.Email)运行查询,但所有这些表的实际数据都存储在一个名为 Data 的表中。

所以您应该直接查询Data 并使用 MIMETYPE 列来确定您正在迭代的当前行的“类型”。

这是一个获取姓名、电子邮件、电话的示例。 您可以将更多 mimetypes 添加到列表中以获取更多类型的数据。 我正在使用 HashMap 来保存每个联系人 ID 的值列表,但您可能希望创建一个自定义 Contact 类并将该信息放入其中。

Map<Long, List<String>> contacts = new HashMap<Long, List<String>>();

String[] projection = Data.CONTACT_ID, Data.MIMETYPE, Data.DATA1, Data.DATA2, Data.DATA3;

// query only name/emails/phones
String selection = Data.MIMETYPE + " IN ('" + StructuredName.CONTENT_ITEM_TYPE + "', '" + Phone.CONTENT_ITEM_TYPE + "', '" + Email.CONTENT_ITEM_TYPE + "')";
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(Data.CONTENT_URI, projection, selection, null, null);

while (cur != null && cur.moveToNext()) 
    long id = cur.getLong(0);
    String mime = cur.getString(1); // type of data (name / phone / email)
    String data = cur.getString(2); // the actual info, e.g. +1-212-555-1234

    String kind = "unknown";

    switch (mime) 
        case Phone.CONTENT_ITEM_TYPE: 
            kind = "phone"; 
            break;
        case StructuredName.CONTENT_ITEM_TYPE: 
            kind = "name";
            break;
        case Email.CONTENT_ITEM_TYPE: 
            kind = "email";
            break;
    
    Log.d(TAG, "got " + id + ", " + kind + " - " + data);

    // add info to existing list if this contact-id was already found, or create a new list in case it's new
    List<String> infos;
    if (contacts.containsKey(id)) 
        infos = contacts.get(id);
     else 
        infos = new ArrayList<String>();
        contacts.put(id, infos);
    
    infos.add(kind + " = " + data);

【讨论】:

以上是关于Android 内容提供程序。如何通过通讯录中的一个请求获取所有数据的主要内容,如果未能解决你的问题,请参考以下文章

通过 Android 中的内容提供程序检查数据库表是不是存在

入门篇:9.组件4:ContentProvider(内容提供者)

android开发怎样获取通讯录联系人信息

如何使用内容提供程序在 Sqlite 数据库中查询 Android 中的时间戳列?

如何在android源代码中打印出日志

android第一行代码-9.内容提供器