实施Dao会导致应用程序崩溃(Kotlin)
实施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>
@Query("SELECT * FROM `employee-table` where id=:id")
fun fetchEmployeebyId(id: Int): Flow>
}
(实体)
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清单)
(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: module)
// 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()"这行代码的问题。对于问题的描述不清晰,我表示抱歉。我在这个领域非常没有经验,也不知道如何进一步说明问题。
非常感谢您的帮助。
实现Dao导致应用程序崩溃(Kotlin)
最近,在Gradle文件中我似乎搞砸了。为了使应用程序正常工作,我必须使用以下依赖的1.5版本(而不是更高版本)。
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.32"
原因:
在Gradle文件中,我错误地使用了错误的依赖版本。这导致应用程序在运行时崩溃。
解决方法:
我需要将Gradle文件中的依赖版本更正为1.5.32,以匹配我的代码中使用的版本。这将解决Dao导致应用程序崩溃的问题。
文章整理如下:
最近,我似乎在Gradle文件中搞砸了。为了使我的应用程序正常工作,我必须使用特定版本的依赖项。具体来说,我需要使用1.5.32版本的kotlin-gradle-plugin。然而,我错误地在Gradle文件中使用了错误的依赖版本,这导致了应用程序在运行时崩溃。
为了解决这个问题,我需要将Gradle文件中的依赖版本更正为1.5.32。这样,我的应用程序将与我编写的代码所需的版本匹配,从而避免了Dao导致应用程序崩溃的问题。
要修复这个问题,我只需在Gradle文件中找到以下行:
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:错误的版本号"
然后将其更正为:
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.32"
通过这个简单的更改,我成功解决了Dao导致应用程序崩溃的问题。现在,我的应用程序可以正常运行了。
在Gradle文件中使用错误的依赖版本可能会导致应用程序崩溃。为了解决这个问题,我们需要确保Gradle文件中的依赖版本与我们的代码所需的版本匹配。通过更正错误的依赖版本,我们可以避免Dao导致应用程序崩溃的问题,并确保应用程序正常工作。
问题的原因是依赖版本不匹配,解决方法是清理gradle文件,保证依赖版本一致。具体的解决方案如下:
首先,在app/build.gradle文件中添加以下依赖项:
implementation 'androidx.room:room-runtime:2.4.2' kapt 'androidx.room:room-compiler:2.4.2' implementation 'androidx.room:room-ktx:2.4.2'
然后,清理gradle文件,确保依赖版本与代码中提供的版本匹配。根据反馈,这个解决方案似乎有效。
如果这个解决方案有效,你可以点击勾选标记来接受答案。这可能会帮助其他人立即找到解决方案。
问题的根源在于其他依赖项的版本不匹配。尽管如此,你提供的答案仍然有帮助,因为我从其他stackoverflow帖子中复制粘贴了各种依赖项,不确定每个依赖项的作用。