“kotlin”sqlite 查询一条记录

Posted

技术标签:

【中文标题】“kotlin”sqlite 查询一条记录【英文标题】:"kotlin" sqlite query for one record 【发布时间】:2018-09-30 20:15:51 【问题描述】:

我们不敢相信我们会问这个问题! 我们如何在 SQLite 数据库中查询一条记录?

假设我们想要 id 但只知道表中的名称

这是调用数据库的代码

        btnGetID.setOnClickListener 
        val dbManager = DBHelper(this)
        val name = etPerson.text.toString()
        dbManager.getOneName(name)
        println("##################### where is return"+empName)
    

这里是 DB 有趣的 getOneName

    fun getOneName(name: String): String 

    val db = this.writableDatabase
    val selectQuery = "SELECT  * FROM $TABLE_NAME WHERE $colName = name"
    // val selectQuery = "SELECT  * FROM $TABLE_NAME WHERE $colId = id"
    val cursor = db.rawQuery(selectQuery, null)
    var empName = ""
    //var empID = 0

        if (cursor.getCount() > 0) 
            cursor.moveToFirst()
            empName = cursor.getString(cursor.getColumnIndex(colName))
            //empID = cursor.getInt(cursor.getColumnIndex(colId))
        
        cursor.close()
        println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ID "+empName)
        return empName

这个数据库有一个模型,应用有一个适配器

class Contact

var id: Int = 0
var name: String = ""

我们想输入名称并检索 id 我们甚至无法检索名称。 我们在 Java 中已经多次这样做了,但在 Kotlin 中没有运气

【问题讨论】:

【参考方案1】:

比如喜欢

fun getOneName(name: String): Contact? 
    val db = this.writableDatabase
    val selectQuery = "SELECT  * FROM $TABLE_NAME WHERE $colName = ?"
    db.rawQuery(selectQuery, arrayOf(name)).use  // .use requires API 16
        if (it.moveToFirst()) 
            val result = Contact()
            result.id = it.getInt(it.getColumnIndex(colId))
            result.name = it.getString(it.getColumnIndex(colName))
            return result
        
    
    return null

并使用类似

btnGetID.setOnClickListener 
    val dbManager = DBHelper(this)
    val name = etPerson.text.toString()
    val contact = dbManager.getOneName(name)
    println("##################### where is return"+contact?.name)

$TABLE_NAME"SELECT * FROM $TABLE_NAME WHERE $colName = ?" 中的$colName 在调用前被替换并变成像"SELECT * FROM persons WHERE name = ?" 这样的常规字符串。

然后db.rawQuery 运行,第二个参数用于提供您的实际查询参数。

selectionArgs – 您可以在查询的 where 子句中包含 ?s,它将被 selectionArgs 中的值替换。这些值将绑定为字符串。

不要"SELECT * FROM $TABLE_NAME WHERE $colName = '$name'"或little Bobby来咬你

【讨论】:

这太好了,我输入了名字并想取回 id 吗?这将花费我几个小时,相信我的小鲍比很快就会被书签不止一次地咬我 DUH etPerson.setText(contact?.id.toString()) ".use" 是从哪里来的 从来没有见过它和将 Java 转换为 Kotlin 的过程一定从未见过给出奇怪的结果 @Grendel .use 是添加到 Closable 的 Kotlin extension 函数。它本质上是 kotlin 的 try-with-resources:***.com/questions/26969800/… - 但是:Cursor 直到 api 级别 16 才实现 Closable,因此在旧手机上运行时可能会崩溃。但是您也可以将该扩展功能添加到您自己的代码中:discuss.kotlinlang.org/t/why-cursor-use-does-not-compiles/5454/…

以上是关于“kotlin”sqlite 查询一条记录的主要内容,如果未能解决你的问题,请参考以下文章

获取sqlite中的上一条/下一条记录

Kotlin基础从入门到进阶系列讲解(入门篇)下载SQLite软件,如何创建/添加/更新/查询/删除数据

Kotlin基础从入门到进阶系列讲解(入门篇)下载SQLite软件,如何创建/添加/更新/查询/删除数据

eclipse-android开发过程中,将sqlite字段原值手工修改后,无法查询到关联的下一个表

使用 Sqlite flutter BETWEEN 查询返回最近 2 天的记录

删除sqlite中的记录一个一个或一个列表更快