SQLite 中的空字符串值导致应用崩溃 - Kotlin Android Studio

Null String Value in SQLite Causing App to Crash - Kotlin Android Studio

提问人:Ben Whittington 提问时间:11/17/2023 更新时间:11/18/2023 访问量:12

问:

我有一个SQLite数据库,我根据用户的输入从中获取数据,然后设置EditText来显示此信息。数据库中的某些列可能是 NULL,这似乎导致我的应用程序在调用该函数时崩溃。如何检查该值是否为 NULL,以及如何为其分配一个非 null 值,例如“N/A”或简称为“”?

这是我的 getter 函数:

    fun getWidth(flange: String): String {
    var width = "Test"
    val db = readableDatabase
    val select = "SELECT * FROM $FLANGE_TABLE WHERE $COLUMN_FLANGE = $flange"
    val cursor = db.rawQuery(select, null)
    if (cursor.moveToFirst()) {
            width = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_WIDTH))
    }
    return width
}

这是我设置 EditText 的地方:

        binding.flangeButton.setOnClickListener {
        flange = binding.flangeNumber.text.toString()
        val width = databaseHelper.getWidth(flange)
        binding.width.setText(width)
    }

如果存在非 null 值,则这两组代码都可以正常工作。

sqlite kotlin android-studio

评论


答:

0赞 k314159 11/18/2023 #1

使用 Elvis 运算符:

width = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_WIDTH)) ?: ""

顺便说一句,您的代码容易受到 SQL 注入攻击。应使用参数化语句:

val select = "SELECT * FROM $FLANGE_TABLE WHERE $COLUMN_FLANGE = ?"
val cursor = db.rawQuery(select, flange)

评论

1赞 Ben Whittington 11/18/2023
这奏效了,谢谢!旁注给可能看到此内容的任何其他人。我不得不做一个小的改变来实施你的SQL注入攻击解决方案。rawQuery 要求 selectionArgs 是一个数组,所以我必须添加然后更改为val selectArgs = arrayOf(flange)val cursor = db.rawQuery(select, selectArgs)