当数据库为空时,我有一个没有结果的查询。因此,NULL是正确的返回值。
但是,Android Studio中的编译器向我发出警告:条件'maxDateTime!= null'始终为'true'。
如果我调试代码,则null检查正确执行,因为该值实际上为null。
当我将接口(interface)重写为“fun queryMaxServerDate():字符串吗?” (注意问号),编译器警告消失。
但是“fun queryMaxServerDate():String”是否不应该导致编译错误,因为它可以为null?
@Dao
interface CourseDao {
// Get latest downloaded entry
@Query("SELECT MAX(${Constants.COL_SERVER_LAST_MODIFIED}) from course")
fun queryMaxServerDate(): String
}
// calling function
/**
* @return Highest server date in table in milliseconds or 1 on empty/error.
*/
fun queryMaxServerDateMS(): Long {
val maxDateTime = courseDao.queryMaxServerDate()
var timeMS: Long = 0
if (maxDateTime != null) { // Warning: Condition 'maxDateTime != null' is always 'true'
timeMS = TimeTools.parseDateToMillisOrZero_UTC(maxDateTime)
}
return if (timeMS <= 0) 1 else timeMS
}
最佳答案
注释生成的基础代码是 java ,因此,按照以下规定,null安全性为异常(exception):
Null Safety
例如在 CourseDao 中为 queryMaxServerDate()生成的代码如下:
@Override
public String queryMaxServerDate() {
final String _sql = "SELECT max(last_mopdified) from course";
final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
__db.assertNotSuspendingTransaction();
final Cursor _cursor = DBUtil.query(__db, _statement, false, null);
try {
final String _result;
if(_cursor.moveToFirst()) {
final String _tmp;
_tmp = _cursor.getString(0);
_result = _tmp;
} else {
_result = null;
}
return _result;
} finally {
_cursor.close();
_statement.release();
}
}
如您所见,没有提取数据(没有第一行)并且返回null。