Android保存图片时出现SQLiteException near "."错误求助
解决Android保存图片到DCIM自定义文件夹时的SQLiteException near "."错误
兄弟,我太懂这种查了一堆资料还是卡SQLite语法错误的崩溃感了!咱们来一步步揪出这个near "."问题的根源,毕竟这个错误基本都是SQL语法格式踩坑了。
一、先抓核心:near "."错误到底啥意思?
SQLite抛出这个错误,本质是它解析你的SQL语句时,在不该出现点号的地方看到了点号,或者点号的用法不符合语法规范。在Android保存图片到媒体库的场景里,大概率是和MediaStore插入数据时的参数设置有关。
二、最常见的踩坑场景&解决办法
1. 自定义文件夹名称带点号,坑了媒体库的SQL解析
如果你给DCIM下的自定义文件夹命名成了DCIM.MyAppPhotos这种带点号的格式,往MediaStore插入数据时,这个点号会被SQL当成标识符的分隔符,直接触发语法错误。
修正方案:
把文件夹路径改成用斜杠分隔的标准格式,比如DCIM/MyAppPhotos,然后正确设置RELATIVE_PATH字段:
val contentValues = ContentValues().apply { put(MediaStore.Images.Media.DISPLAY_NAME, "photo_${System.currentTimeMillis()}.jpg") put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg") // 这里用斜杠分隔路径,别用点号! put(MediaStore.Images.Media.RELATIVE_PATH, "${Environment.DIRECTORY_DCIM}/MyAppPhotos") }
2. ContentValues里的键写错成了带点号的完整类路径
有些同学会不小心把MediaStore的列常量完整路径当成键塞进ContentValues,比如写成"MediaStore.Images.Media.DATA",这会导致SQL语句里出现一堆带点号的非法标识符,直接报错。
错误示例:
// 千万别这么写!把常量的完整类名当键了 contentValues.put("MediaStore.Images.Media.DATA", photoFilePath)
正确写法:
直接用MediaStore提供的常量本身,或者对应的列名字符串:
// 推荐:用官方常量,避免拼写错误 contentValues.put(MediaStore.Images.Media.DATA, photoFilePath) // 或者直接用列名的字符串 contentValues.put("_data", photoFilePath)
3. 手动写SQL语句时点号用错了
如果你的代码里有用到rawQuery这类手动构造SQL的方法,那得仔细检查语句里的点号:比如是不是多写了点号,或者表名和列名的分隔点号用错了位置。
错误示例:
-- 错误:列名前面多了个点号 SELECT ._id FROM images WHERE display_name LIKE '%test%'
正确示例:
-- 正确写法:要么直接写列名,要么用表名.列名 SELECT _id FROM images WHERE display_name LIKE '%test%' SELECT images._id FROM images WHERE display_name LIKE '%test%'
三、给你的排查小建议
- 把完整的错误日志(包括触发错误的完整SQL语句和堆栈跟踪)贴出来,这能瞬间锁定问题点——你提到有包含实际SQL命令的错误信息,补充出来的话排查会更快!
- 先检查
ContentValues里的所有键值对,确保没有带点号的非法键; - 确认自定义文件夹的路径格式是标准的斜杠分隔,没有点号乱入;
- 如果你用的是
MediaStore.insert()方法,核对所有字段的设置是否符合Android官方规范,有没有拼写错误。
内容的提问来源于stack exchange,提问作者Joshua Feltimo
相关产品推荐
相关产品推荐

