提问人:Ben Whittington 提问时间:11/17/2023 更新时间:11/18/2023 访问量:12
SQLite 中的空字符串值导致应用崩溃 - Kotlin Android Studio
Null String Value in SQLite Causing App to Crash - Kotlin Android Studio
问:
我有一个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 值,则这两组代码都可以正常工作。
答:
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)
评论