无效令牌 SELECT

Invalid token SELECT

您好,我正在尝试使用 android 中的内容解析器获取存储桶 ID 的内容 问我收到此错误

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #7
Process: com.dev.newtermain, PID: 13048
java.lang.IllegalArgumentException: Invalid token SELECT
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:172)
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)
    at android.content.ContentProviderProxy.query(ContentProviderNative.java:472)
    at android.content.ContentResolver.query(ContentResolver.java:1183)
    at android.content.ContentResolver.query(ContentResolver.java:1115)
    at android.content.ContentResolver.query(ContentResolver.java:1071)

我的选择查询是

selection = "bucket_id = ?) UNION SELECT _data, date_added, 0 as isImage FROM video WHERE (bucket_id = ?";
uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
selectionArgs = new String[]{bucketIdString};
String[] projection = new String[]{
            MediaStore.Images.ImageColumns.DATA, MediaStore.Images.ImageColumns.DATE_ADDED, MediaStore.Video.VideoColumns.DATE_ADDED
    };
Cursor cur = context.getContentResolver()
            .query(uri, projection, selection, selectionArgs, MediaStore.Images.ImageColumns.DATE_ADDED + " DESC");

知道如何修复此查询

查看此选择

"SELECT _data, date_added, 0 as isImage FROM video WHERE bucket_id = ?";
  • 在开始时删除了 bucket_id = ?) - 这是错误的,格式不正确,不适合查询的开头...
  • 删除了 UNION 之后,因为根本没有联合两个选择器,只是简单查询单个 video table
  • 最后删除了不需要的左括号(WHERE (bucket_id = ?WHERE bucket_id = ?

但请注意 query 是封装的,不接受完整的单字符串 sqlite 查询,您必须将其拆分为多个部分。变量 selection 将是 "bucket_id = ?" 以匹配 selectionArgs

另请注意,投影有点奇怪...

String[] projection = new String[]{
        MediaStore.Images.ImageColumns.DATA, MediaStore.Images.ImageColumns.DATE_ADDED, MediaStore.Video.VideoColumns.DATE_ADDED
};

前两个值使用 MediaStore.Images 而不是 MediaStore.Video,所有三个值都不匹配 selection SELECT _data, date_added, 0 as isImage FROM 中的参数 - 我看到两个参数,一个可能不匹配需要静态值

编辑:我刚刚注意到您是按图像选择的 - MediaStore.Images.Media.EXTERNAL_CONTENT_URI - 但选择指向视频列...我也怀疑 bucket_id 列存在于 MediaStore 数据库,在列的静态声明中没有这样的值......我建议你阅读一些关于 sql 和查询的内容,因为你的代码片段看起来每一行都来自另一段代码......

ContentResolver::query 中的 selection 参数仅支持 WHERE 子句(没有 WHERE 关键字)。 docs

您的方法是在 selection 中包含无效的 UNION 子句。如果你需要一个联合,你可能必须做两个单独的查询并自己组合两个结果。

编辑

对于您的具体情况,selection 应定义如下

selection = "bucket_id = ?"