Android 访问ANKO布局组件内的ANKO sqlite数据库
我想访问我的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
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()
感谢您不仅为具体问题提供了解决方案,还为我改进了架构:)关于改进架构与否,我不知道。但我认为这是一个很好的解决方案。