Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 访问ANKO布局组件内的ANKO sqlite数据库_Android_Sqlite_Kotlin_Anko - Fatal编程技术网

Android 访问ANKO布局组件内的ANKO sqlite数据库

Android 访问ANKO布局组件内的ANKO sqlite数据库,android,sqlite,kotlin,anko,Android,Sqlite,Kotlin,Anko,我想访问我的ANKO SQLite数据库,在我的AnkoComponent中。但是,我在组件范围内收到一个错误提示,在使用AnkoComponent的活动中,它工作正常 这是我的ANKO SQLite数据库 package com.example.jokegenerator import android.content.Context import android.database.sqlite.SQLiteDatabase import org.jetbrains.anko.db.* cl

我想访问我的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 layout组件的活动,组件应该从中使用按钮内部的数据库。我已经在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) {

            }
        }
    }
}

为什么不从活动中访问它?我认为最好让UI只关注UI

首先,在名为getRndJoke的JokeActivityUI中创建lateinit变量

class JokeActivityUI : AnkoComponent<JokeActivity> {

     lateinit var getRndJoke: Button

     ...
}
因此,您可以在活动中轻松访问数据库,如下所示:

class JokeActivity : AppCompatActivity() {

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

        JokeActivityUI().getRndJoke.onClick {

           database.use {
              ...
           }
        }
    }
}
val ui = JokeActivityUI()
额外:我认为最好创建实例JokeActivity我喜欢这样:

class JokeActivity : AppCompatActivity() {

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

        JokeActivityUI().getRndJoke.onClick {

           database.use {
              ...
           }
        }
    }
}
val ui = JokeActivityUI()

感谢您不仅为具体问题提供了解决方案,还为我改进了架构:)关于改进架构与否,我不知道。但我认为这是一个很好的解决方案。