I am developing a new book android app but app crashes when I am testing the code getting following exceptions from logcat
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bookkeepers/com.example.bookkeepers.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.bookkeepers.BookViewModel at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2843) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2921) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1639) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:176) at android.app.ActivityThread.main(ActivityThread.java:6662) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873) Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.bookkeepers.BookViewModel at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:208) at androidx.l
ifecycle.ViewModelProvider.get(ViewModelProvider.java:135) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103) at com.example.bookkeepers.MainActivity.onCreate(MainActivity.kt:30) at android.app.Activity.performCreate(Activity.java:7074) at android.app.Activity.performCreate(Activity.java:7065) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2796) ... 9 more 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) ... 16 more Caused by: java.lang.RuntimeException: cannot find implementation for com.example.bookkeepers.BookRoomDatabase. BookRoomDatabase_Impl does not exist at androidx.room.Room.getGeneratedImplementation(Room.java:94) at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:952) at com.example.bookkeepers.BookRoomDatabase$Companion.getDatabase(BookRoomDatabase.kt:24) at com.example.bookkeepers.BookViewModel.(BookViewModel.kt:12) ... 19 more
below my BookViewModel class which extends AndroidViewModel class
class BookViewModel(application: Application) : AndroidViewModel(application) {
private val bookDao: BookDao
init {
val bookDb = BookRoomDatabase.getDatabase(application)
bookDao = bookDb!!.bookDao()
}
fun insert(book: Book) {
InsertAsyncTask(bookDao).execute(book)
}
companion object {
private class InsertAsyncTask(private val bookDao: BookDao) :
AsyncTask<Book, Void, Void>() {
override fun doInBackground(vararg books: Book): Void? {
bookDao.insert(books[0])
return null
}
}
}}
below MainActivity.kt class
MainActivity : AppCompatActivity() {
lateinit var bookViewModel: BookViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
fab.setOnClickListener { view ->
val intent = Intent(this, NewBookActivity::class.java)
startActivityForResult(intent, NEW_NOTE_ACTIVITY_REQUEST_CODE)
}
bookViewModel = ViewModelProviders.of(this).get(BookViewModel::class.java)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == NEW_NOTE_ACTIVITY_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
val id = UUID.randomUUID().toString()
val authorName = data!!.getStringExtra(NewBookActivity.NEW_AUTHOR)
val bookName = data!!.getStringExtra(NewBookActivity.NEW_BOOK)
val book = Book(id, authorName, bookName)
bookViewModel.insert(book)
Toast.makeText(
applicationContext,
R.string.saved,
Toast.LENGTH_LONG
).show()
} else {
Toast.makeText(
applicationContext,
R.string.not_saved,
Toast.LENGTH_LONG
).show()
}
}
companion object{
private const val NEW_NOTE_ACTIVITY_REQUEST_CODE = 1
}}
below database class
@Database(entities = [Book::class], version = 1)
abstract class BookRoomDatabase :RoomDatabase() {
abstract fun bookDao():BookDao
companion object {
private var bookRoomInstance:BookRoomDatabase? = null
fun getDatabase(context: Context): BookRoomDatabase? {
if (bookRoomInstance == null)
synchronized(BookRoomDatabase::class.java){
if(bookRoomInstance == null){
bookRoomInstance = Room.databaseBuilder<BookRoomDatabase>(context.applicationContext,
BookRoomDatabase::class.java, "book_database")
.build()
}
}
return bookRoomInstance
}
}}
below dao class
@Dao
interface BookDao {
@Insert
fun insert(book: Book)
}
below book entity class
@Entity(tableName = "books")
class Book(@PrimaryKey val id: String,
@ColumnInfo(name = "author")
val author: String,
val book:String) {
}