如何在没有初始化的情况下在Kotlin中声明一个val,可以从课堂上的任何乐趣中获得?

时间:2018-05-28 00:33:40

标签: android kotlin

我在Kotlin中创建了一个内容提供程序,它使用数据库存储数据并使用加载器查询它们,问题是,我需要从任何函数都可以访问我的DBHelper变量:onCreate,query,update,等等...在java中这很容易但是在Kotlin中IDE告诉我必须初始化val,我尝试使用init块但是android studio说DBHelper必须在onCreate()中初始化

那么,如何在Kotlin中创建一个可以对类中的任何函数执行的val,并且可以像on Java一样在onCreate函数中初始化?

这是我的代码:

public class ProviderMMR : ContentProvider() {
var dbHelper


companion object Matcher{
    var uriMatcher = UriMatcher(UriMatcher.NO_MATCH)

    init{
        uriMatcher.addURI(MMDContract.columnas.AUTHORITY,MMDContract.columnas.TABLA_FARMACIA,1)
    }

}

override fun onCreate(): Boolean {
    dbHelper  =  mmrbd(context)

    return true
}

override fun insert(uri: Uri?, values: ContentValues?): Uri {
    val db = dbHelper.writableDatabase

    val rowID = db.insert(MMDContract.columnas.TABLA_FARMACIA, null, values)


    val uri_actividad = ContentUris.withAppendedId(MMDContract.columnas.CONTENT_BASE_URI, rowID)

    return uri_actividad



}

override fun query(uri: Uri?, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?, sortOrder: String?): Cursor {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}


override fun update(uri: Uri?, values: ContentValues?, selection: String?, selectionArgs: Array<out String>?): Int {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

override fun delete(uri: Uri?, selection: String?, selectionArgs: Array<out String>?): Int {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

override fun getType(uri: Uri?): String {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

}

4 个答案:

答案 0 :(得分:6)

您还可以使用lazy delegate,它将在首次访问时创建您的dbHelper对象

extern

答案 1 :(得分:5)

您可以使用lateinit var并在onCreate中初始化它。 检查延迟初始化的属性和变量,以供参考。 https://kotlinlang.org/docs/reference/properties.html

答案 2 :(得分:1)

那么你可以通过2-3种方式实现它,所以在Kotlin中我们有代理允许你在第一次访问时初始化变量,即变量在第一次使用时被初始化,所以你可以做到

val dbHelper by lazy { mmrbd(context) }

或者你可以用Java的方式做到这一点:

var dbHelper: mmrbd? = null

并在OnCreate中将其初始化为:dbHelper = mmrbd(context)

或者您可以使用Kotlin的lateinit关键字,它基本上允许您稍后初始化变量,但在使用变量之前,您有责任对其进行初始化:

lateinit var dbHelper: mmrbd

并在OnCreate中将其初始化为:dbHelper = mmrbd(context)

答案 3 :(得分:0)

如果你正在使用&#34; dbHelper&#34;从多个地方开始,使用延迟初始化程序会更好,因此变量可以具有一次值并在调用时初始化 如果您没有使用&#34; dbHelper&#34;从多个线程中,您可以将LazyThreadSafetyMode.NONE添加到延迟初始化程序以获得更高的性能。了解更多信息: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-lazy-thread-safety-mode/-n-o-n-e.html

val uri by lazy(LazyThreadSafetyMode.NONE){
mmrbd(context)
}

如果您要使用lateinit,则必须使用var,在您的情况下,添加私有设置会更好,因此未在类外部初始化变量

 class  ProviderMMR : ContentProvider() {
 companion object {
   lateinit var dbHelper: mmrbd
        private set
 }

override fun onCreate() {
    super.onCreate()
    dbHelper= mmrbd(context)
 }
}