Как я могу объявить val в Kotlin без инициализации, которая может быть достигнута из любого развлечения в классе? - PullRequest
0 голосов
/ 28 мая 2018

Я создаю контент-провайдера в Котлине, который использует БД для хранения данных и запрашивает их с помощью загрузчиков, проблема в том, что мне нужно, чтобы моя переменная DBHelper была доступна из любой функции: onCreate, query, update и т. Д...В Java это легко, но в Kotlin IDE говорит мне, что я должен инициализировать val, я пытался использовать блоки init, но Android Studio говорит, что DBHelper должен быть инициализирован в onCreate ()

Итак, как можноЯ создаю val в Kotlin, который можно повторно использовать для любой функции в классе и который можно инициализировать в функции onCreate, например, в Java?

Это мой код:

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 голосов
/ 31 мая 2018

Если вы используете "dbHelper" из нескольких мест, лучше использовать ленивый инициализатор, чтобы переменная могла иметь значение один раз и инициализироваться после вызова, а если вы не используете "dbHelper" из нескольких потоков, вы можете добавить 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)
 }
}
0 голосов
/ 28 мая 2018

Вы также можете использовать отложенный делегат, который создаст ваш объект dbHelper при первом доступе

val dbHelper by lazy { mmrbd(context) }
0 голосов
/ 31 мая 2018

Ну, вы можете достичь этого 2-3 способами, поэтому в Kotlin у нас есть делегаты, которые позволяют вам инициализировать переменную при первом обращении к ней, т.е. переменная инициализируется при каждом ее первом использовании, поэтому вы можете сделать

val dbHelper by lazy { mmrbd(context) }

Или вы можете сделать это в Java, как вы можете сказать:

var dbHelper: mmrbd? = null

и инициализировать его в OnCreate, например: dbHelper = mmrbd(context)

Или вы можете использовать ключевое слово lateinitKotlin, который в основном позволяет вам инициализировать переменную позже, но вы обязаны инициализировать ее перед использованием переменной:

lateinit var dbHelper: mmrbd

и инициализировать ее в OnCreate, например: dbHelper = mmrbd(context)

0 голосов
/ 28 мая 2018

Вы можете использовать lateinit var и инициализировать его в onCreate.Проверьте поздно инициализированные свойства и переменные здесь для справки.https://kotlinlang.org/docs/reference/properties.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...