找不到数据库 Room 的实现

5

我正在使用Room编写我的第一个应用程序。我发现当它使用kotlin时会出现问题,甚至一些示例在我的计算机上也无法正常工作,所以我回滚到了纯Java。

FilmsDatabaseJ db = Room.databaseBuilder(getApplicationContext(), FilmsDatabase.class, "DATABASE_NAME").build();

这个调用会抛出异常:

java.lang.RuntimeException: cannot find implementation for com.home.myapplication.films.storage.FilmsDatabase. FilmsDatabase_Impl does not exist

我查看了源代码,Room 期望已经有这样的类(是否在某处生成?),但由于某些原因,在我的情况下该类并不存在,而我的情况与文档所述并无太大差异。您能否分享一下您的想法,可能出了什么问题呢?

@TypeConverters({Converters.class})
@Database(entities = {Film.class, User.class, UserFilms.class}, version = 1)
public abstract class FilmsDatabaseJ extends RoomDatabase {

    private static final String DATABASE_NAME = "DATABASE_NAME";

    private static FilmsDatabaseJ instance;

    public abstract FilmsDaoJ getFilmsDao();


    @NotNull
    public static FilmsDatabaseJ getInstance(Context context) {
        if (instance == null) {
            synchronized (FilmsDatabaseJ.class) {
                if (instance != null) return
                instance = Room.databaseBuilder(context, FilmsDatabaseJ.class, DATABASE_NAME).build();
            }
        }
        return instance;
    }
} 



   annotationProcessor "android.arch.lifecycle:compiler:1.1.1"

    // Room (use 1.1.0-beta2 for latest beta)
    implementation "android.arch.persistence.room:runtime:1.0.0"
    annotationProcessor "android.arch.persistence.room:compiler:1.0.0"

你在 build.gradledependencies 闭包中添加了注解处理器吗?请参阅 https://developer.android.com/topic/libraries/architecture/adding-components.html。 - CommonsWare
你标题中的错误与问题中的错误不同。你遇到了哪一个?如果你遇到了“可用公共构造函数”的错误,那么它可能与你的@Entity类或任何在@Dao类上的方法返回的POJO有关。 - CommonsWare
好的。注解处理器应该在您的模块内(例如app/)生成代码,路径为build/generated/source/apt/debug/com/home/myapplication/films/storage/impl/。那里有任何显示吗? - CommonsWare
没有,什么都没有。只有这个build/generated/source/apt/debug。 - Gleichmut
不,没有其他错误。无论如何,感谢您的帮助! - Gleichmut
显示剩余3条评论
2个回答

11

这是因为Kotlin编译器无法很好地处理@Database java注释(它为您生成FilmsDatabase_Impl)。

所以要解决这个问题:

  • 首先,您需要获取kapt插件来解析Kotlin文件中的注释,并将其添加到您的应用级Gradle中:

    apply plugin: 'kotlin-kapt'

  • 然后将Room的编译器中的annotationProcessor替换为kapt

    kapt "android.arch.persistence.room:compiler:1.0.0"

  • 重新编译项目,现在您应该可以看到生成那些样板代码并解决以上错误。


谢谢。我已经有一段时间没有使用Room了,也许我已经找到了答案,但我不记得了。当我有时间验证时,我会接受你的回复。 - Gleichmut
是的,以防其他人遇到相同的问题,希望这能有所帮助。 - Trung Le
四年过去了,问题还是一样! - dobhareach

0
解决方案: def room_version = "2.3.0"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-ktx:2.3.0"

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