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

7 浏览
0 Comments

实施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()"这行代码的问题。对于问题的描述不清晰,我表示抱歉。我在这个领域非常没有经验,也不知道如何进一步说明问题。

非常感谢您的帮助。

0
0 Comments

实现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导致应用程序崩溃的问题,并确保应用程序正常工作。

0
0 Comments

问题的原因是依赖版本不匹配,解决方法是清理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帖子中复制粘贴了各种依赖项,不确定每个依赖项的作用。

0