房间数据库查询在Kotlin中应为空安全的位置返回空

房间数据库查询在Kotlin中应为空安全的位置返回空,kotlin,android-room,Kotlin,Android Room,当数据库为空时,我有一个没有结果的查询。因此,NULL是正确的返回值 但是,Android Studio中的编译器给了我一个警告:条件'maxDateTime!=“null”总是“true” 如果我调试代码,null检查将正确执行,因为值实际上为null 当我将接口重写为“fun queryMaxServerDate():String?”(注意问号)时,编译器警告消失了 但是“fun queryMaxServerDate():String”不应该导致编译错误,因为它可以为null @Dao in

当数据库为空时,我有一个没有结果的查询。因此,NULL是正确的返回值

但是,Android Studio中的编译器给了我一个警告:
条件'maxDateTime!=“null”总是“true”

如果我调试代码,null检查将正确执行,因为值实际上为null

当我将接口重写为“fun queryMaxServerDate():String?”(注意问号)时,编译器警告消失了

但是“fun queryMaxServerDate():String”不应该导致编译错误,因为它可以为null

@Dao
interface CourseDao {

    // Get latest downloaded entry
    @Query("SELECT MAX(${Constants.COL_SERVER_LAST_MODIFIED}) from course")
    fun queryMaxServerDate(): String

}

//调用函数
/**
*@return表中的最高服务器日期(以毫秒为单位)或1为空/错误。
*/
fun queryMaxServerDateMS():长{
val maxDateTime=courseDao.queryMaxServerDate()
var timeMS:Long=0
如果(maxDateTime!=null){//警告:条件“maxDateTime!=null”始终为“true”
timeMS=TimeTools.parseDateToMillisOrZero\u UTC(maxDateTime)
}

如果(timeMS注释生成的底层代码是java,则返回空安全异常,如下所示:-

Kotlin的类型系统旨在从中消除NullPointerException 我们的准则。NPE的唯一可能原因可能是:

抛出NullPointerException()的显式调用;的用法!! 下文所述的操作员

一些数据不一致的方面 要初始化,请执行以下操作:

  • 一个未初始化的文件可以在 构造函数被传递并在某处使用(“泄漏此”)
  • A 超类构造函数调用其在 派生类使用未初始化状态
  • Java互操作:
    • 尝试访问平台类型的空引用上的成员
    • 用于Java互操作的泛型类型具有不正确的nullability, e、 g.一段Java代码可能会将null添加到Kotlin中 MutableList,意味着应该使用MutableList 与之合作
    • 外部Java代码引起的其他问题

e、 g.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

  @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();
    }
  }