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

时间:2017-06-03 18:11:28

标签: android sqlite kotlin

我正在定义我的Users 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中的等效代码工作正常,那么,是否有人知道原因是什么或错误在哪里?

1 个答案:

答案 0 :(得分:7)

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

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

例如,如果你有BaseColumns作为kotlin类而不是java接口,你可以做类似的事情:

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的子类