Android库开发中SQLite报错‘Cannot prepare statement, base error code: -92’咨询
Cannot prepare statement, base error code: -92错误 我帮你梳理下这个问题的根源和可行的解决办法,毕竟我也碰到过类似的Robolectric SQLite测试坑。
先搞清楚错误代码-92的含义
在Robolectric的ShadowSQLite实现里,错误码-92通常关联SQLite语法不兼容或者Robolectric的SQLite版本和目标Android版本不匹配的问题。因为Robolectric用的是自己模拟的SQLite环境,和真机上的SQLite可能存在语法支持差异——比如某些高版本SQLite的特性(比如WITH子句、特定函数),在Robolectric的旧版模拟层里还没适配。
可行的解决方案
1. 检查SQL语句的兼容性
- 先把你的SQL语句拿到真机或者SQLiteStudio这类工具里跑一遍,确认语法本身没问题。
- 如果用了Android高版本才支持的SQL特性(比如Android 11+的
RETURNING子句),Robolectric的模拟环境可能不支持,得改成兼容低版本的写法,或者针对测试环境单独调整SQL。
2. 指定Robolectric的目标Android SDK版本
有时候Robolectric默认的SDK版本和你的项目目标版本不一致,导致SQLite模拟层不匹配。你可以在测试类上通过注解指定准确的SDK版本:
@RunWith(RobolectricTestRunner.class) @Config(sdk = Build.VERSION_CODES.TIRAMISU) // 改成你的项目目标SDK版本 public class YourSqliteTest { // ... 测试代码 }
3. 更新Robolectric版本
旧版本的Robolectric对SQLite的模拟有不少bug,升级到最新稳定版往往能解决这类兼容性问题。比如在你的Module级build.gradle里更新依赖:
testImplementation 'org.robolectric:robolectric:4.12.1' // 替换成最新稳定版本
4. 切换到Robolectric的真实SQLite实现(可选)
如果上面的方法都不行,可以尝试让Robolectric使用真实的SQLite库而非模拟层,在@Config里添加配置:
@Config(application = Application.class, sdk = Build.VERSION_CODES.TIRAMISU, useRealSqlite = true)
不过这个选项可能会带来一些测试性能损耗,但能彻底解决模拟层的兼容性问题。
5. 检查拼写错误或表结构匹配问题
有时候这个错误也可能是SQL里的表名、字段名拼写错误,或者测试时数据库表结构还没创建完成就执行查询。可以在测试初始化阶段,确保调用SQLiteOpenHelper的getWritableDatabase()方法,保证表结构已正确创建。
总结
优先从SQL语法和版本兼容性入手排查,这是最常见的触发原因。如果还是不行,升级Robolectric或者切换到真实SQLite实现,基本能解决问题。
内容的提问来源于stack exchange,提问作者xcesco

