【问题标题】:Invalid column deleted while trying to query a column尝试查询列时删除了无效列
【发布时间】:2016-08-24 10:53:39
【问题描述】:

我正在尝试在我的 android 应用中执行以下查询:

private static final String[] PROJECTION =
            {
                    Data.CONTACT_ID, Data.MIMETYPE,
                    Data.DISPLAY_NAME, Phone.NUMBER,
                    Phone.TYPE, StructuredName.GIVEN_NAME,
                    StructuredName.MIDDLE_NAME,
                    StructuredName.FAMILY_NAME,
                    Data.DELETED
            };


private static final String SELECTION = "(" + Data.MIMETYPE + " = ? AND "
        + Phone.TYPE + " IN (?,?,?)) OR ("
        + Data.MIMETYPE + " IN (?))";


private static final String[] SELECTION_ARGS =
        {
                Phone.CONTENT_ITEM_TYPE,
                String.valueOf(Phone.TYPE_MOBILE),
                String.valueOf(Phone.TYPE_HOME),
                String.valueOf(Phone.TYPE_WORK),
                StructuredName.CONTENT_ITEM_TYPE
        };
final Cursor cursor = mContext.getContentResolver().query(
                Data.CONTENT_URI, PROJECTION, SELECTION, SELECTION_ARGS, Data.CONTACT_ID);

但我收到以下错误:

04-29 11:00:58.715  8588 15565 E DatabaseUtils: Writing exception to parcel 04-29 11:00:58.715  8588 15565 E 
DatabaseUtils: java.lang.IllegalArgumentException: Invalid column deleted 04-29 11:00:58.715  8588 15565 E 
DatabaseUtils:  at android.database.sqlite.SQLiteQueryBuilder.computeProjection(SQLiteQueryBuilder.java:632) 04-29 11:00:58.715  8588 15565 E 
DatabaseUtils:  at android.database.sqlite.SQLiteQueryBuilder.buildQuery(SQLiteQueryBuilder.java:447) 04-29 11:00:58.715  8588 15565 E 
DatabaseUtils:  at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:387) 04-29 11:00:58.715  8588 15565 E 
DatabaseUtils:  at com.android.providers.contacts.ContactsProvider2.doQuery(ContactsProvider2.java:6528) 04-29 11:00:58.715  8588 15565 E 
DatabaseUtils:  at com.android.providers.contacts.ContactsProvider2.queryLocal(ContactsProvider2.java:6479) 04-29 11:00:58.715  8588 15565 E 
DatabaseUtils:  at com.android.providers.contacts.ContactsProvider2.query(ContactsProvider2.java:5038) 04-29 11:00:58.715  8588 15565 E 
DatabaseUtils:  at android.content.ContentProvider$Transport.query(ContentProvider.java:238) 04-29 11:00:58.715  8588 15565 E 
DatabaseUtils:  at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112) 04-29 11:00:58.715  8588 15565 E 
DatabaseUtils:  at android.os.Binder.execTransact(Binder.java:453)

我想知道我正在阅读的联系人是否被删除,因此我需要 Data.DELETED 列,这似乎是导致错误的原因。 但是当我检查Android documentation 时,DELETED 似乎确实是与 ContactsContract.Data 一起使用的有效列。

【问题讨论】:

  • 根据该文档,您必须将 ContactsContract.RawContacts 表与 ContactsContract.Contacts 表一起“加入”才能访问这些附加字段
  • 从我目前看到的情况来看,我可以看到可以在自定义表上进行连接。但由于联系人表是通过内容解析器访问的,我不确定如何进行连接。
  • 虽然我个人不熟悉它,但您可以尝试这里建议的“原始查询”吗? stackoverflow.com/questions/4957009/…
  • 好吧,我不认为联系人数据库的表名暴露在外面。使用内容解析器查询,我将只传递一个 URI。不要认为我可以像那篇文章中提到的那样进行连接,因为表名是未知的。

标签: android sqlite android-sqlite


【解决方案1】:

How do implicit joined columns work with Android contacts data? 中提到的将 URI 更改为 ContactsContract.RawContactsEntity.CONTENT_URI 似乎有效。

【讨论】:

    猜你喜欢
    • 2017-05-27
    • 2011-12-05
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    相关资源
    最近更新 更多