首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问ANKO布局组件中的ANKO sqlite

访问ANKO布局组件中的ANKO sqlite
EN

Stack Overflow用户
提问于 2019-03-04 20:17:52
回答 1查看 59关注 0票数 0

我想访问我的ANKO SQLite数据库,在我的AnkoComponent里面。但是,在组件的作用域内,我会被提示一个错误,在使用AnkoComponent的活动中,它工作得很好。

这是我的ANKO SQLite数据库

代码语言:javascript
复制
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的代码中进行了注释,以指定。

代码语言:javascript
复制
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) {

            }
        }
    }
}

然而,我收到了一条错误信息,上面写着:

公共val Context.database:在com.example.jokegenerator文件Database.kt中定义的DatabaseOpenHelper

但是在使用布局的活动中,我可以很好地使用数据库。

代码语言:javascript
复制
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")
            }


        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-05 09:47:09

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

首先,在JokeActivityUI中创建名为getRndJoke的延迟变量。

代码语言:javascript
复制
class JokeActivityUI : AnkoComponent<JokeActivity> {

     lateinit var getRndJoke: Button

     ...
}

然后将变量getRndJoke分配给按钮

代码语言:javascript
复制
getRndJoke = button {
   text = "get random joke!"
}.lparams(width = matchParent)

因此,您可以在这样的活动中轻松地访问数据库:

代码语言:javascript
复制
class JokeActivity : AppCompatActivity() {

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

        JokeActivityUI().getRndJoke.onClick {

           database.use {
              ...
           }
        }
    }
}

Extern外:我认为最好像这样创建实例JokeActivityUI:

代码语言:javascript
复制
val ui = JokeActivityUI()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54990914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档