找不到数据库 Room 的实现
cannot find implementation for database 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 预计已经有这样的 class(是否在某处生成?),但出于某种原因,对于我的案例来说,这样的 class 不存在,离文档。您能否分享您的想法,这里可能出了什么问题?
@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"
这是因为 kotlin 编译器不能很好地使用 @Database java 注释(它会为您生成 FilmsDatabase_Impl
)。
所以要解决这个问题:
首先你需要获取 kapt
插件来解析 kotlin 文件中的注释,将其添加到你的应用级别 gradle:
apply plugin: 'kotlin-kapt'
然后将 Room 编译器的 annotationProcessor
替换为 kapt
kapt "android.arch.persistence.room:compiler:1.0.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"
我正在用 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 预计已经有这样的 class(是否在某处生成?),但出于某种原因,对于我的案例来说,这样的 class 不存在,离文档。您能否分享您的想法,这里可能出了什么问题?
@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"
这是因为 kotlin 编译器不能很好地使用 @Database java 注释(它会为您生成 FilmsDatabase_Impl
)。
所以要解决这个问题:
首先你需要获取
kapt
插件来解析 kotlin 文件中的注释,将其添加到你的应用级别 gradle:apply plugin: 'kotlin-kapt'
然后将 Room 编译器的
annotationProcessor
替换为kapt
kapt "android.arch.persistence.room:compiler:1.0.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"