我正在尝试从Android上的一个活动中调用我的数据库(由Room创建),但是它需要应用程序上下文,如果我在Activity的构造函数中传递了“ application:Application”,则构建崩溃并告诉我:
java.lang.Class <com.exemple.instabus.PhotoActivity>没有零参数构造函数
这是我的代码:
class PhotoActivity(application: Application) : AppCompatActivity() {
private val pictureDao = PictureDatabase.getDatabase(app)
//Some code ....
我需要上下文,我尝试传递“ this”,但是又遇到另一个错误
有人可以给我些帮助吗,我是这项技术的初学者
编辑:
这是我的数据库类,只是为了向您展示为什么我需要一个应用程序上下文
@Database(entities = [Picture::class], version = 1, exportSchema = false)
abstract class PictureDatabase : RoomDatabase(){
abstract fun pictureDao() : PictureDao
companion object{
@Volatile
private var INSTANCE : PictureDatabase? = null
fun getDatabase(context: Context): PictureDatabase {
if(INSTANCE == null){
synchronized(this){
INSTANCE = Room.databaseBuilder(
context.applicationContext,
PictureDatabase::class.java,
"pictures.db"
).build()
}
}
return INSTANCE!!
}
}
}
活动是我们在清单中声明的东西,然后使用来启动它们intent
。但是,活动实例的创建是由system
而不是由我们完成的。使用创建实例constructor
,但是如果是我们,则可以有任意数量的重载构造函数。但是系统仅需要一个构造函数,该构造函数应该是零参数构造函数,并且应该是公共的。
所以你的活动签名
class PhotoActivity(application: Application) : AppCompatActivity() {
应该更改为
class PhotoActivity() : AppCompatActivity() {
要呼叫,fun getDatabase(context: Context): PictureDatabase
您可以this
从传递activity
。活动是的间接子项Context
。
您可以通过以下方式进行操作:
private val pictureDao by lazy{ PictureDatabase.getDatabase(this) }
private lateinit var pictureDao:PictureDatabase
然后在onCreate()
初始化它final override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.your_layout)
PictureDatabase.getDatabase(this)
//your logic goes here
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句