实现Dao导致应用程序崩溃(Kotlin)



我一直在Udemy上遵循Android应用程序开发教程,并正在努力使房间数据库工作。

链接到GitHub: https://github.com/tutorialseu/RoomDatabaseDemo/tree/169_completing_the_demo

由于某种原因,下面这行会导致应用程序在加载后崩溃。我试着尽可能地遵循教程,甚至复制了代码的某些部分,但似乎没有任何工作。

val employeeDao = (application as EmployeeApp).db.employeeDao()

下面是其余的代码:

(主要活动)
package com.example.roomdatabasedemo
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.lifecycle.lifecycleScope
import com.example.roomdatabasedemo.databinding.ActivityMainBinding
import kotlinx.coroutines.launch
class MainActivity : AppCompatActivity() {
private var binding: ActivityMainBinding? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding?.root)
val employeeDao = (application as EmployeeApp).db.employeeDao()
binding?.btnAdd?.setOnClickListener {
addRecord(employeeDao)
}
}
private fun addRecord(employeeDao: EmployeeDao) {
val name = binding?.etName?.text.toString()
val email = binding?.etEmailId?.text.toString()
if (name.isNotEmpty() && email.isNotEmpty()) {
lifecycleScope.launch {
employeeDao.insert(EmployeeEntity(name = name, email = email))
Toast.makeText(
applicationContext,
"Record saved.",
Toast.LENGTH_SHORT
).show()
binding?.etName?.text?.clear()
binding?.etEmailId?.text?.clear()
}
}
else {
Toast.makeText(
applicationContext,
"Name or Email cannot be blank.",
Toast.LENGTH_SHORT
).show()
}
}
}

(数据库)

package com.example.roomdatabasedemo
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
@Database(entities = [EmployeeEntity::class], version = 2)
abstract class EmployeeDatabase: RoomDatabase() {
abstract fun employeeDao(): EmployeeDao
companion object {
@Volatile
private var INSTANCE: EmployeeDatabase? = null
fun getInstance(context: Context): EmployeeDatabase {
synchronized(this) {
var instance = INSTANCE
if (instance == null) {
instance = Room.databaseBuilder(
context.applicationContext,
EmployeeDatabase::class.java,
"employee_database"
).fallbackToDestructiveMigration().build()
INSTANCE = instance
}
return instance
}
}
}
}

(Dao)

package com.example.roomdatabasedemo
import androidx.room.*
import kotlinx.coroutines.flow.Flow
@Dao
interface EmployeeDao {
@Insert
suspend fun insert(employeeEntity: EmployeeEntity)
@Update
suspend fun update(employeeEntity: EmployeeEntity)
@Delete
suspend fun delete(employeeEntity: EmployeeEntity)
@Query("SELECT * FROM `employee-table`")
fun fetchAllEmployees(): Flow<List<EmployeeEntity>>
@Query("SELECT * FROM `employee-table` where id=:id")
fun fetchEmployeebyId(id: Int): Flow<List<EmployeeEntity>>
}

(实体)

package com.example.roomdatabasedemo
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "employee-table")
data class EmployeeEntity(
@PrimaryKey(autoGenerate = true)
var id: Int=0,
var name: String="",
@ColumnInfo(name = "email-id")
var email: String=""
)

(应用)

package com.example.roomdatabasedemo
import android.app.Application
class EmployeeApp: Application() {
val db by lazy {
EmployeeDatabase.getInstance(this)
}
}

(Android清单)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.roomdatabasedemo">
<application
android:allowBackup="true"
android:name=".EmployeeApp"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.RoomDatabaseDemo"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

(gradle: app)

plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt'
}
android {
compileSdk 32
defaultConfig {
applicationId "com.example.roomdatabasedemo"
minSdk 24
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
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'
}

buildFeatures {
viewBinding true
}
}
dependencies {
implementation 'androidx.room:room-runtime:2.4.2'
annotationProcessor 'androidx.room:room-compiler:2.4.2'
implementation('androidx.room:room-ktx:2.4.2')
implementation 'androidx.activity:activity-ktx:1.5.0'
implementation 'androidx.core:core-ktx:1.8.0'
implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

(gradle:模块)

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id 'com.android.application' version '7.2.0' apply false
id 'com.android.library' version '7.2.0' apply false
id 'org.jetbrains.kotlin.android' version '1.7.10' apply false
}
task clean(type: Delete) {
delete rootProject.buildDir
}

下面是我试图调试它时得到的错误信息。

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.roomdatabasedemo, PID: 30895
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.roomdatabasedemo/com.example.roomdatabasedemo.MainActivity}: java.lang.RuntimeException: cannot find implementation for com.example.roomdatabasedemo.EmployeeDatabase. EmployeeDatabase_Impl does not exist
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4035)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4201)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2438)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8663)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)
Caused by: java.lang.RuntimeException: cannot find implementation for com.example.roomdatabasedemo.EmployeeDatabase. EmployeeDatabase_Impl does not exist
at androidx.room.Room.getGeneratedImplementation(Room.java:100)
at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:1486)
at com.example.roomdatabasedemo.EmployeeDatabase$Companion.getInstance(EmployeeDatabase.kt:26)
at com.example.roomdatabasedemo.EmployeeApp$db$2.invoke(EmployeeApp.kt:7)
at com.example.roomdatabasedemo.EmployeeApp$db$2.invoke(EmployeeApp.kt:6)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at com.example.roomdatabasedemo.EmployeeApp.getDb(EmployeeApp.kt:6)
at com.example.roomdatabasedemo.MainActivity.onCreate(MainActivity.kt:19)
at android.app.Activity.performCreate(Activity.java:8290)
at android.app.Activity.performCreate(Activity.java:8270)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4009)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4201) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2438) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loopOnce(Looper.java:226) 
at android.os.Looper.loop(Looper.java:313) 
at android.app.ActivityThread.main(ActivityThread.java:8663) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135) 

请帮我解决"val employeeDao = (application as EmployeeApp).db.employeeDao()"&quot行出了什么问题。对不起,我把问题弄得很模糊。我在这方面很缺乏经验,不知道如何进一步说明这个问题。

任何帮助都将不胜感激。

使用这些实现

implementation 'androidx.room:room-runtime:2.4.2'
kapt 'androidx.room:room-compiler:2.4.2'
implementation 'androidx.room:room-ktx:2.4.2'

把这些放到app/build.gradle

看起来我在Gradle文件中搞砸了。我必须使用以下依赖项的1.5版本(而不是更高版本)才能使应用程序工作。

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.32"

最新更新