如何指定正确的SQLiteDatabase.query返回类型

时间:2020-06-01 20:33:35

标签: android sqlite android-studio kotlin

Android Studio让我转圈!使用以下代码

fun fetchAllPOIs(): Cursor? {
    if (myDbHelper.myDataBase != null)
        return myDbHelper.myDataBase!!.query(
        "POIs", arrayOf(
            "Name", "Type",
            "Latitude", "Longitude", "_id"
        ), null, null, null, null, null
    )
}

Android Studio在结尾处标记一个错误,说

具有块主体的函数中需要的“返回”表达式。

建议的快速修复方法是

删除显式指定的封闭函数“ DBAdapter.fetchAllPOIs”的返回类型

如果我接受快速修复,则代码看起来像

    fun fetchAllPOIs() {
    if (myDbHelper.myDataBase != null)
        return myDbHelper.myDataBase!!.query(
        "POIs", arrayOf(
            "Name", "Type",
            "Latitude", "Longitude", "_id"
        ), null, null, null, null, null
    )
}

,大多数功能都有下划线。建议的快速修复为

将封闭函数的返回类型更改为“游标?”

当我接受这一点时,我回到第一个方框!

我要如何摆脱呢?

1 个答案:

答案 0 :(得分:1)

让我们回到原始来源:

fun fetchAllPOIs(): Cursor? {
    if (myDbHelper.myDataBase != null)
        return myDbHelper.myDataBase!!.query(
        "POIs", arrayOf(
            "Name", "Type",
            "Latitude", "Longitude", "_id"
        ), null, null, null, null, null
    )
}

如果myDbHelper.myDataBase == null应该返回什么?编译器不知道,因为您没有告诉它要返回什么。

假设您要返回null

您有三种可能的解决方案。 Java风格的解决方案是:

fun fetchAllPOIs(): Cursor? {
    if (myDbHelper.myDataBase != null) {
        return myDbHelper.myDataBase!!.query(
        "POIs", arrayOf(
            "Name", "Type",
            "Latitude", "Longitude", "_id"
        ), null, null, null, null, null)
    } else {
      return null
    }
}

您还有更多的Kotlin-y“将收益从if / else中剔除”的方法:

fun fetchAllPOIs(): Cursor? {
    return if (myDbHelper.myDataBase != null) {
      myDbHelper.myDataBase!!.query(
        "POIs", arrayOf(
            "Name", "Type",
            "Latitude", "Longitude", "_id"
        ), null, null, null, null, null)
    } else {
      null
    }
}

您将拥有非常安全的Kotlin-y呼叫方式:

fun fetchAllPOIs(): Cursor? {
    return myDbHelper.myDataBase?.query(
        "POIs", arrayOf(
            "Name", "Type",
            "Latitude", "Longitude", "_id"
        ), null, null, null, null, null)
}

?.是“安全呼叫”运算符。如果myDbHelper.myDataBase不是null,它将调用query()。如果myDbHelper.myDataBase null,则?.跳过query()调用并求值为null

如果您打算返回null以外的其他内容,那么其中一些内容将需要修改。