无效令牌 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 = ?"
您好,我正在尝试使用 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 = ?"