「cannot find implementation for database.」というエラーが出て、画面遷移ができません。
解決したいこと
ボタンをタップして画面遷移ができるようにしたい。
kotlinでToDoListを作っています。
buildすると、最初のページが表示され、
「ToDoを追加」のボタンを押すと、
クラッシュします。
次の画面へ遷移するようにしたいです。
解決方法を教えて下さい。
発生している問題・エラー
Logcatのエラーです。
2022-07-17 20:43:35.266 20659-20659/com.example.todolist E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.todolist, PID: 20659
java.lang.RuntimeException: cannot find implementation for database.ToDoDatabase. ToDoDatabase_Impl does not exist
at androidx.room.Room.getGeneratedImplementation(Room.java:100)
at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:1486)
at database.ToDoDatabase$Companion.getInstance(ToDoDatabese.kt:29)
at com.example.todolist.EditFragment.onCreateView(EditFragment.kt:26)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7844)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
ToDoDatabese.ktの内容です。
package database
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
@Database(entities = [ToDo::class], version = 1, exportSchema = false)
abstract class ToDoDatabase : RoomDatabase() {
abstract val toDoDatabaseDao: ToDoDatabaseDao
companion object {
@Volatile
private var INSTANCE: ToDoDatabase? = null
fun getInstance(context: Context): ToDoDatabase {
synchronized(this) {
var instance = INSTANCE
if (instance == null) {
instance = Room.databaseBuilder(
context.applicationContext,
ToDoDatabase::class.java,
"to_do_database"
)
.fallbackToDestructiveMigration()
.build()
INSTANCE = instance
}
return instance
}
}
}
}
EditFragment.ktの内容です。
package com.example.todolist
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.example.todolist.databinding.FragmentEditBinding
import database.ToDoDatabase
class EditFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?,
): View? {
val binding: FragmentEditBinding = DataBindingUtil.inflate(
inflater, R.layout.fragment_edit, container, false)
val application = requireNotNull(this.activity).application
val dataSource = ToDoDatabase.getInstance(application).toDoDatabaseDao
val viewModelFactory = EditViewModelFactory(dataSource, application)
val editViewModel =
ViewModelProvider(
this, viewModelFactory).get(EditViewModel::class.java)
binding.editViewModel = editViewModel
binding.lifecycleOwner = this
return binding.root
}
}
例)build.gradle(app)の内容です。
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
compileSdk 32
defaultConfig {
applicationId "com.example.todolist"
minSdk 23
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
dataBinding {
enabled = true
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
implementation "androidx.appcompat:appcompat:$supportlibVersion"
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation "com.google.android.material:material:1.2.1"
implementation "androidx.navigation:navigation-fragment-ktx:$navigationVersion"
implementation "androidx.navigation:navigation-ui-ktx:$navigationVersion"
implementation "com.google.android.material:material:$supportlibVersion"
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
implementation 'androidx.room:room-common:2.4.2'
implementation 'androidx.room:room-ktx:2.4.2'
kapt "android.arch.persistence.room:compiler:1.1.1"
implementation 'androidx.room:room-runtime:2.4.2'}
自分で試したこと
ネットでエラーを検索して、
build.gradle(app)のdependencies {
に検索して出てきた解決方法を追記・消去しました。
多くを検索して、実行しましたが解決に至りません。
解決方法をご教授ください。
0 likes