无法找到数据库Room的实现

时间:2018-04-12 15:50:28

标签: android android-room

我正在写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"

2 个答案:

答案 0 :(得分:3)

这是因为kotlin编译器无法与@Database Java注释(为您生成FilmsDatabase_Impl)配合使用。

因此要解决此问题:

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

    apply plugin: 'kotlin-kapt'

  • 然后将annotationProcessor替换为kapt作为会议室的编译器

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

  • 现在再次编译项目,您应该看到生成了这些样板代码并解决了以上错误。

答案 1 :(得分: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"