android - 无法访问 BaseColumns 在 Kotlin 中提供了 _ID 属性

标签 android sqlite kotlin

我正在定义我的用户 SQLite 数据库表,为此,我创建了以下 UserContract 和 UserEntry 类:

class UserContract private constructor(){

    class UserEntry private constructor(): BaseColumns {

        companion object {
            val TABLE_NAME = "users"
            val COLUMN_DISPLAY_NAME = "display_name"
            val COLUMN_EMAIL = "email"
            //...
        }
    }
}

我面临的问题是我无法访问 BaseColums 实现提供的 _ID 属性:

val columnDisplayName = UserContract.UserEntry.COLUMN_DISPLAY_NAME //It is OK
val columnId = UserContract.UserEntry._ID //Unresolved reference: _ID

Java 中的等效代码运行良好,那么,有谁知道是什么原因或错误在哪里?

最佳答案

您只能使用 BaseColumns._ID 访问它,因为它是一个定义常量的 Java 接口(interface)。

在 Kotlin 中,伴生对象是具有继承性的实际对象,而在 java 中,具有静态方法的类的行为并不像对象。

例如,如果您将 BaseColumns 作为 kotlin 类而不是 java 接口(interface),则可以执行以下操作:

open class KBaseColumns  {
    val _ID = "_id"
}

class UserContract private constructor(){
    class UserEntry private constructor(): BaseColumns {
        companion object : KBaseColumns() {
            val TABLE_NAME = "users"
            val COLUMN_DISPLAY_NAME = "display_name"
            val COLUMN_EMAIL = "email"
        }
    }
}

object Example {
    fun someMethod() {
        val id = UserContract.UserEntry._ID
    }
}

在这种情况下 _ID 是可访问的,因为伴随对象实际上是 KBaseColumns

的子类

关于android - 无法访问 BaseColumns 在 Kotlin 中提供了 _ID 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44347113/

相关文章:

c# - 在 SQLite 数据库中放置和检索图像

JavaFX 更新 Sqlite 表

java - 如何使用 java 从 kotlin 类读取回调 (Android)

android - 如何知道屏幕在 Android 中使用 320-hdpi 或 320-mdpi

iphone - 在 Sqlite 中绑定(bind) bool 值

android - 移动设备上的视口(viewport)元标记问题

android - 当我们有 ViewModels 时,我们还需要 onSaveInstanceState() 吗?

java - 如何将java库添加到kotlin native

java - 解析多种文件类型的文本

Android:如何创建模态进度 "Wheel"叠加层?