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.Phone
和 CommonDataKinds.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(内容提供者)