从Room数据库查询结果中获取整数失败问题求助
问题分析与解决步骤
1. LiveData使用方式完全错误
你直接在子线程里拿LiveData实例转字符串的做法根本不对——LiveData是用来观察数据变化的,不能直接取值。而且你在子线程调用converter.setText(),会触发UI线程异常,Android不允许非主线程操作UI。
正确做法:Room会自动在后台执行返回LiveData的查询,不需要手动开子线程,直接在主线程观察LiveData即可:
// 主线程(比如Activity的onCreate方法内) TextView converter = findViewById(R.id.converter); mDb.personDao().loaddifferconstants(spinA, spinB).observe(this, result -> { if (result != null) { converter.setText(String.valueOf(result)); } else { converter.setText("无匹配结果"); } });
2. 非LiveData方法必须在后台线程调用
像int count()这种同步返回的DAO方法,绝对不能在主线程调用,否则会直接崩溃。必须把调用放到后台线程,再切回主线程更新UI:
AppExecutors.getInstance().diskIO().execute(() -> { int count = mDb.personDao().count(); // 切回主线程更新UI runOnUiThread(() -> { converter.setText("总记录数:" + count); }); });
3. SQL查询的潜在问题
你的JOIN语句没有ON条件,属于交叉连接,会返回t1中符合spinA的行和t2中符合spinB的行的所有组合。如果spinA或spinB对应多行,查询会返回多个结果,而Room返回单个Integer时会报错(因为结果不是单行)。
要么确保每个model对应唯一行,要么修改SQL强制返回单行:
SELECT (t1.const - t2.const) AS result FROM person t1, person t2 WHERE t1.model = :spinA AND t2.model = :spinB LIMIT 1; -- 强制只返回第一行结果
或者用聚合函数确保单行结果:
SELECT MAX(t1.const) - MAX(t2.const) AS result FROM person t1, person t2 WHERE t1.model = :spinA AND t2.model = :spinB;
4. 类型匹配检查
确保person表中const列的类型是INTEGER,和DAO返回的Integer/int类型严格匹配。如果是其他数值类型(比如REAL),要把DAO返回类型改成对应的类型(比如Float)。
内容的提问来源于stack exchange,提问作者Alex T
相关产品推荐
相关产品推荐

