доступ к базе данных ANKO sqlite внутри компонента компоновки ANKO - PullRequest
0 голосов
/ 04 марта 2019

Я хочу получить доступ к моей базе данных ANKO SQLite внутри моего AnkoComponent.Однако в области действия компонента появляется сообщение об ошибке, и в операции, использующей AnkoComponent, он работает просто отлично.

Это моя база данных ANKO SQLite

package com.example.jokegenerator

import android.content.Context
import android.database.sqlite.SQLiteDatabase
import org.jetbrains.anko.db.*

class DatabaseOpenHelper(context: Context) :
        ManagedSQLiteOpenHelper(context, "Database", null, 2) {


    companion object {
        private var instance: DatabaseOpenHelper? = null

        @Synchronized
        fun getInstance(ctx: Context): DatabaseOpenHelper {
            if (instance == null) {
                instance = DatabaseOpenHelper(ctx.getApplicationContext())
            }
            return instance!!
        }
    }

    override fun onCreate(db: SQLiteDatabase) {
        // Here you create tables
        db.createTable("Jokes", true,
            "id" to INTEGER + PRIMARY_KEY + UNIQUE,
            "joke" to TEXT)
        db.insert("Jokes",
            "joke" to "Humor is not for everyone")
    }

    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
        db.dropTable("User", true)
    }
}

val Context.database: DatabaseOpenHelper
    get() = DatabaseOpenHelper.getInstance(getApplicationContext())

Этоявляется действием, использующим компонент макета ANKO, откуда компонент должен использовать базу данных внутри кнопки.Я прокомментировал внутри кода AnkoComponent, чтобы указать.

class JokeActivityUI : AnkoComponent<JokeActivity> {

    override fun createView(ui: AnkoContext<JokeActivity>) = with(ui) {
        verticalLayout {
            textView {

            }.lparams(width = matchParent) {

            }
            var getRndJoke = button {
                text = "get random joke!"


                onClick {
                    database.use{ //prompted with error written below!

                    }


                }
            }.lparams(width = matchParent) {

            }
            button {
                text = "create a joke"
                onClick {
                    startActivity<CreateJokeActivity>()
                }
            }.lparams(width = matchParent) {

            }
            button {
                text = "frontpage"
                onClick {
                    startActivity<MainActivity>()
                }
            }.lparams(width = matchParent) {

            }
        }
    }
}

Однако мне выдается сообщение об ошибке:

public val Context.database: DatabaseOpenHelper определенв com.example.jokegenerator в файле Database.kt

Но внутри упражнения с использованием макета я могу использовать базу данных просто отлично

class JokeActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        JokeActivityUI().setContentView(this)


        database.use { //works just fine in this scope
            val dbJokes = database.use {
                select("Jokes")
            }


        }
    }
}

1 Ответ

0 голосов
/ 05 марта 2019

Почему бы не получить доступ к нему из Activity?Я думаю, что лучше держать UI только на UI* Таким образом, вы можете легко получить доступ к базе данных в Activity следующим образом:

class JokeActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        JokeActivityUI().setContentView(this)

        JokeActivityUI().getRndJoke.onClick {

           database.use {
              ...
           }
        }
    }
}

Дополнительно: я думаю, лучше создать экземпляр JokeActivityUI следующим образом:

val ui = JokeActivityUI()
...