AndroidX Room未解决的超类型RoomDatabase

21

在尝试构建我的应用程序时,我遇到了这个编译错误:

Supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath:
com.example.persistence.AppDatabase, unresolved supertypes: androidx.room.RoomDatabase

持久化设置在单独的Android模块(persistence)中。

build.gradle

// Kotlin StdLib
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

// Room
implementation      "androidx.room:room-runtime:$androidXRoom"
kapt "androidx.room:room-compiler:$androidXRoom"
implementation      "androidx.room:room-rxjava2:$androidXRoom"

ext.androidXRoom = "2.1.0-alpha02"

我尝试更改 Kotlin 版本、 Room 版本,并回到 Android Arch Room,但没有成功。我还尝试过清理项目并使 Android Studio 缓存失效。但仍然无法解决。

编辑:AppDatabase 源代码

package com.example.persistence.db

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import com.example.persistence.post.PostDbDao
import com.example.persistence.post.PostDbEntity

@Database(entities = [PostDbEntity::class], version = 1)
abstract class AppDatabase : RoomDatabase() {

    abstract fun favoritePostsDao(): PostDbDao

    companion object {

        var INSTANCE: AppDatabase? = null

        fun getDatabase(context: Context): AppDatabase? {
            if(INSTANCE == null) {
                synchronized(AppDatabase::class) {
                     INSTANCE = Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, "post_db").build()
                }
            }
            return INSTANCE
        }

        fun destroy() {
            INSTANCE = null
        }
    }

}

请添加以下内容:annotationProcessor "androidx.room:room-compiler:$room_version" // use kapt for Kotlin,然后尝试。 - Ümañg ßürmån
但我已经将其添加到了build.gradle中。我正在使用kapt,因为我正在使用Kotlin编写应用程序。 - jarekbutek
你能否在问题中添加AppDatabase导入并添加完整文件? - Ahmed Abdelmeged
添加了完整的文件。 - jarekbutek
@jarekbutek 你找到解决方案了吗? - Cody
显示剩余4条评论
4个回答

48
问题更可能是你如何定义依赖关系,因为你的 AppDatabase 扩展了 RoomDatabase,并且你在下游依赖项中使用了该类,所以 RoomDatabase 是公共API的一部分。但是 RoomDatabase 被声明为仅实现依赖项。这意味着在编译期间,该类通常无法提供给下游依赖项。

尝试将 "androidx.room:room-runtime:$androidXRoom" 更改为 api 配置,以使其成为公共API的一部分。这应该可以解决你遇到的错误。


30

像这样更改gradle依赖项

   REMOVE -> implementation "androidx.room:room-runtime:$androidXRoom"
   REPLACE WITH -> api "androidx.room:room-runtime:$androidXRoom"

输入图片描述


3
其他答案也许可以编译,但这就失去了为您的数据库/持久性功能提供单独模块的意义。
您不应该将您的Room实体或Room数据库暴露在您的模块之外。相反,在模块中编写一个函数,将您的@Entity PostEntity映射为一个简单的数据类。
我在这里更详细地写了一些内容:https://jacquessmuts.github.io/post/modularization_room/

0
除了答案之外,当我选择创建新模块时选择“模块->Android库”,“api”进程成功完成并提供了解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接