ContentProvider(联系人) - 没有这样的列:metadata_dirty
Posted
技术标签:
【中文标题】ContentProvider(联系人) - 没有这样的列:metadata_dirty【英文标题】:ContentProvider (contacts) - no such column: metadata_dirty 【发布时间】:2017-06-11 15:00:33 【问题描述】:我正在尝试从手机中获取特定类型的所有联系人,如下所示:
Cursor cursor = context.getContentResolver().query(
ContactsContract.RawContacts.CONTENT_URI,
null,
ContactsContract.RawContacts.ACCOUNT_TYPE + "='com.whatsapp'",
null,
ContactsContract.RawContacts.CONTACT_ID + " ASC");
但是这一行已经抛出异常(自定义 rom,牛轧糖 => 可能与此有关?)。我只从一个用户那里得到了这个错误,我被困在这里,有谁知道如何解决这个问题?是否有其他方法可以查询所有联系人?
我的异常如下所示:
Exception: android.database.sqlite.SQLiteException: no such column: metadata_dirty (code 1): , while compiling:
SELECT sort_key, send_to_voicemail, pinned, display_name, metadata_dirty,
phonebook_label_alt, version, phonebook_bucket, _id, custom_ringtone,
times_contacted, account_type_and_data_set, sync4, dirty, sync2,
contact_id, raw_contact_is_user_profile, aggregation_mode, data_set,
phonebook_label, account_type, sync3, display_name_alt, phonetic_name,
last_time_contacted, display_name_source, backup_id, sort_key_alt,
phonebook_bucket_alt, deleted, starred, account_name, sync1, sourceid,
phonetic_name_style
FROM view_raw_contacts_restricted AS view_raw_contacts
WHERE (1)
AND ((account_type='com.whatsapp'))
ORDER BY contact_id ASC
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java)
at android.content.ContentProviderProxy.query(ContentProviderNative.java)
at android.content.ContentResolver.query(ContentResolver.java)
at android.content.ContentResolver.query(ContentResolver.java)
...
【问题讨论】:
【参考方案1】:我没有发现您的查询有任何问题,这似乎是用户自定义 ROM 中的内部错误。
METADATA_DIRTY
是 Android N 中的一个新列:
https://developer.android.com/reference/android/provider/ContactsContract.RawContactsColumns.html#METADATA_DIRTY
所以看起来系统是牛轧糖,但Contacts
DB 是基于旧版本的Android
。
【讨论】:
这很有趣。这意味着,如果用户使用像钛备份这样的根应用程序恢复他的联系人数据库,它可能会为缺少此列的联系人创建一个旧数据库文件(但是,他的 android 系统会认为它存在并创建一个查询这不适用于底层数据库文件)...我会检查一下 是的,当然,我已经看到用户使用钛备份和类似设备的大量问题,它们很容易损坏。 谢谢,这完全有道理,我很确定会发生这种情况......我试图通过在我需要的查询中明确定义字段来避免它,这已经有所帮助。但这解释了根本原因。谢谢 嘿,我在生产环境中遇到了这个错误,在非 root 设备(如 Crashalitics 报告)上,操作系统为 6、7、9 的设备。所以我认为问题出在别的地方 @IlyaGazman 是三星等知名品牌的设备吗?还是那些主要是较小的品牌/中国品牌?以上是关于ContentProvider(联系人) - 没有这样的列:metadata_dirty的主要内容,如果未能解决你的问题,请参考以下文章
Android 开发 ContentProvider 获取歌曲列表和联系人的样例
入门篇:9.组件4:ContentProvider(内容提供者)