sqlite - 在与来自 kotlin 函数的输入匹配的特定列上运行 SELECT,会抛出空指针
问题描述
我正在尝试编写一个将用户名作为输入的方法,并创建一个 SQL 查询语句,然后执行该语句。截至目前,NullPointer
当我尝试打电话时,我得到了一个result.getObject()
。
这是我动态创建 SQL 语句的方法:
fun getByUsername(name: String): User?{
val sql = """SELECT * FROM usertable WHERE username="$name";"""
val result = DatabaseController().trySql(sql)
if (result != null) {
if (!result.isBeforeFirst) {
println("User was not found...")
return null
} else {
println("User found....")
return User(result.getObject("username").toString(),
result.getObject("password").toString(),
result.getObject("admin").toString().toBoolean())
}
}
return null
}
执行查询的方法:
fun trySql(sqlCommand: String): ResultSet? {
var conn = this.connect()
println("trySql()-------Running query $sqlCommand")
var result = conn?.createStatement()?.executeQuery(sqlCommand)
conn?.close()
return result
}
我运行它的用户名也在我的表中,所以这不是问题。我在表中创建一行的方法工作正常,所以我知道连接到数据库没有问题。
编辑
如果我只是返回result
,trySql()
我不再收到任何错误,但从我的阅读来看,我应该在使用后关闭连接吗?
解决方案
为什么你有问题
您正在关闭连接,这会使您返回的 ResultSet 不再有用。您将可以访问结果对象,但结果对象将无法从 SQLite 读取数据,从而导致错误。
怎么修
您可以将一些代码传递给您的 trySql 函数,该函数将在连接仍然打开的情况下执行,然后在传递的块之后关闭。
例子
图书馆
class Con(val con: Connection = DriverManager.getConnection(URL)): AutoCloseable by con {
fun <T> withSQL(query: String, block: (ResultSet)->T): T {
con.createStatement().use { statement ->
statement.executeQuery(query).use { results ->
return block(results)
}
}
}
}
用法
Con().use { con ->
val result: Int = con.withSQL("SELECT * from example WHERE name='test'") {
it.getInt(1)
}
}
推荐阅读
- yugabyte-db - 修改 YugaByteDb 中的主配置
- ios - SwiftUI:列表上的渐变背景
- html - 将文本基线对齐到 div 的底部
- typescript - Why can't Typescript detect that an object is defined when using && short-circuit evaluation of multiple levels of keys in the object?
- c# - 游戏开始时按钮未启用
- python - 我有多个“。”的数字字符串数据。我想删除所有“。” 除了小数点
- domain-driven-design - CQRS - 根据来自多个投影的决策应用命令
- ios - `audioPlayerDidFinishPlaying` 没有被调用
- python - Python:模块中的多处理 Queue.put() 不会向父进程发送任何内容
- javascript - 返回数字 && 数字在 JavaScript 中的作用是什么?