我的ViewModel类抛出了RunTimeException
。它基本上不能创建ViewModel类的实例。这是堆栈跟踪:
2019-05-29 01:27:56.700 9698-9698/com.example.cryptpass_kt E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.cryptpass_kt, PID: 9698
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.cryptpass_kt/com.example.cryptpass_kt.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.cryptpass_kt.EntryViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2853)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2928)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1609)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6703)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.cryptpass_kt.EntryViewModel
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:208)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103)
at com.example.cryptpass_kt.MainActivity.onCreate(MainActivity.kt:40)
at android.app.Activity.performCreate(Activity.java:6980)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2806)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2928)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1609)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6703)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:200)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103)
at com.example.cryptpass_kt.MainActivity.onCreate(MainActivity.kt:40)
at android.app.Activity.performCreate(Activity.java:6980)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2806)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2928)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1609)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6703)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
Caused by: java.lang.RuntimeException: cannot find implementation for com.example.cryptpass_kt.EntryDatabase. EntryDatabase_Impl does not exist
at androidx.room.Room.getGeneratedImplementation(Room.java:94)
at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:667)
at com.example.cryptpass_kt.EntryDatabase$Companion.getInstance(EntryDatabase.kt:17)
at com.example.cryptpass_kt.EntryRepository.<init>(EntryRepository.kt:12)
at com.example.cryptpass_kt.EntryViewModel.<init>(EntryViewModel.kt:8)
错误指向应用程序中的4个不同位置,所有这些位置均源于同一问题。例如,我的onCreate()
的{{1}}方法中的这些行在stacktrace中:
MainActivity.kt
我遵循了SO中的一些建议,例如将ViewModel对象初始化为override fun onCreate(savedInstanceState: Bundle?) {
...
viewModel = ViewModelProviders.of(this).get(EntryViewModel::class.java)
viewModel.allEntries.observe(this, Observer { entries -> adapter.submitList(entries) })
...
}
而不是lateinit
,但到目前为止,它并未对此情况进行任何更改
EntryViewModel.kt
null
EntryDatabase.kt
class EntryViewModel(application: Application) : AndroidViewModel(application) {
private val repository: EntryRepository = EntryRepository(application)
val allEntries: LiveData<List<Entry>>
init {
allEntries = repository.allEntries!!
}
fun insert(entry: Entry) {
repository.insert(entry)
}
fun update(entry: Entry) {
repository.update(entry)
}
fun delete(entry: Entry) {
repository.update(entry)
}
fun deleteAll() {
repository.deleteAllEntries()
}
}
我拥有所有必要的gradle依赖项:
@Database(entities = [Entry::class], version = 1)
abstract class EntryDatabase : RoomDatabase() {
abstract fun entryDAO(): EntryDAO
companion object{
private var instance: EntryDatabase? = null
@Synchronized
fun getInstance(context: Context): EntryDatabase{
if(instance == null){instance = Room.databaseBuilder<EntryDatabase>(context.applicationContext, EntryDatabase::class.java, "entry_database").fallbackToDestructiveMigration().build()}
return instance as EntryDatabase
}
}
}
答案 0 :(得分:0)
在您发布的stacktrace中,将异常放在另一个之中。因此,最后一个是问题的主要根源:
Caused by: java.lang.RuntimeException: cannot find implementation for com.example.cryptpass_kt.EntryDatabase. EntryDatabase_Impl does not exist
at androidx.room.Room...
从stacktrace中可以看到,尝试获取数据库实例时出错。我认为在ViewModel
构造函数中获取数据库引用不是一个好主意,但这不是必不可少的。
关于您的数据库代码:有一些可能的原因。
1。依赖关系。
正如我在类似问题的其他答案中所见(我认为,this one最好),您应该添加一些gradle依赖项:
// Extensions = ViewModel + LiveData
implementation "android.arch.lifecycle:extensions:1.1.0"
kapt "android.arch.lifecycle:compiler:1.1.0"
// Room
implementation "android.arch.persistence.room:runtime:1.0.0"
kapt "android.arch.persistence.room:compiler:1.0.0"
如果我做对了,那么Kotlin仅需要一些其他的依赖项(使用关键字kapt
而不是implementation
)。
2。注释。
另一个可能的原因:您没有在Entity
类中放置Entry
注释(如this answer中所述)。另一个需要的注释是Database
,但是您已经有了它。
答案 1 :(得分:0)
尝试一下
val viewModel = ViewModelProviders.of(this).get(EntryViewModel::class.java)
并在您的应用程序build.gradle
中 implementation 'android.arch.lifecycle:extensions:1.1.1'