在 Activity 中调用应用程序上下文
Call Application context in Activity
我正在尝试从 Android 上的 activity 调用我的数据库(使用 Room 创建),但它需要应用程序上下文,如果我在我的 Activity 的构造函数,构建崩溃并告诉我:
java.lang.Class<com.exemple.instabus.PhotoActivity> has no zero argument constructor
这是我的代码:
class PhotoActivity(application: Application) : AppCompatActivity() {
private val pictureDao = PictureDatabase.getDatabase(app)
//Some code ....
我需要一个上下文,我试图传递“this”但我遇到了另一个错误
谁能给我一些帮助,我是这项技术的初学者
编辑:
这是我的数据库 class,只是为了向您展示为什么我需要应用程序上下文
@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!!
}
}
}
您不应将 Application
传递给构造函数。您应该将 applicationContext
传递给 getDatabase()
,例如 private val pictureDao = PictureDatabase.getDatabase(applicationContext)
首先创建一个 ViewModel,在 ViewModel 中你可以访问你的 Dao,pictureDao。
class PictureViewModel(application: Application) :
AndroidViewModel(application) {
val pictureDao: PictureDao
init {
pictureDao =
PictureDatabase.getDatabase(application).pictureDao()
}
}
然后在您的 activity 中初始化 ViewModel。并访问您的 Dao。
class PhotoActivity : AppCompatActivity() {
private lateinit var pictureViewModel: PictureViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_photo)
pictureViewModel =
ViewModelProviders.of(this).get(PictureViewModel::class.java)
//You can now access your Dao class here:
val pictureDao = pictureViewModel.pictureDao
}
}
Activity 是我们在清单中声明的东西,然后使用 intent
启动它们,但是,activity 的实例的创建是由 system
而不是我们。实例是使用 constructor
创建的,但如果是我们,那么我们可以有任意数量的重载构造函数。但是系统只需要一个构造函数,它应该是一个零参数构造函数,它应该是 public.
所以你的 activity 签名
class PhotoActivity(application: Application) : AppCompatActivity() {
应该改为
class PhotoActivity() : AppCompatActivity() {
要调用 fun getDatabase(context: Context): PictureDatabase
,您可以从 activity
传递 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
}
我正在尝试从 Android 上的 activity 调用我的数据库(使用 Room 创建),但它需要应用程序上下文,如果我在我的 Activity 的构造函数,构建崩溃并告诉我:
java.lang.Class<com.exemple.instabus.PhotoActivity> has no zero argument constructor
这是我的代码:
class PhotoActivity(application: Application) : AppCompatActivity() {
private val pictureDao = PictureDatabase.getDatabase(app)
//Some code ....
我需要一个上下文,我试图传递“this”但我遇到了另一个错误
谁能给我一些帮助,我是这项技术的初学者
编辑:
这是我的数据库 class,只是为了向您展示为什么我需要应用程序上下文
@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!!
}
}
}
您不应将 Application
传递给构造函数。您应该将 applicationContext
传递给 getDatabase()
,例如 private val pictureDao = PictureDatabase.getDatabase(applicationContext)
首先创建一个 ViewModel,在 ViewModel 中你可以访问你的 Dao,pictureDao。
class PictureViewModel(application: Application) :
AndroidViewModel(application) {
val pictureDao: PictureDao
init {
pictureDao =
PictureDatabase.getDatabase(application).pictureDao()
}
}
然后在您的 activity 中初始化 ViewModel。并访问您的 Dao。
class PhotoActivity : AppCompatActivity() {
private lateinit var pictureViewModel: PictureViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_photo)
pictureViewModel =
ViewModelProviders.of(this).get(PictureViewModel::class.java)
//You can now access your Dao class here:
val pictureDao = pictureViewModel.pictureDao
}
}
Activity 是我们在清单中声明的东西,然后使用 intent
启动它们,但是,activity 的实例的创建是由 system
而不是我们。实例是使用 constructor
创建的,但如果是我们,那么我们可以有任意数量的重载构造函数。但是系统只需要一个构造函数,它应该是一个零参数构造函数,它应该是 public.
所以你的 activity 签名
class PhotoActivity(application: Application) : AppCompatActivity() {
应该改为
class PhotoActivity() : AppCompatActivity() {
要调用 fun getDatabase(context: Context): PictureDatabase
,您可以从 activity
传递 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
}