我的应用数据库类
@Database(entities = {Detail.class}, version = Constant.DATABASE_VERSION)
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase INSTANCE;
public abstract FavoritesDao favoritesDao();
public static AppDatabase getAppDatabase(Context context) {
if (INSTANCE == null) {
INSTANCE =
Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, Constant.DATABASE).allowMainThreadQueries().build();
//Room.inMemoryDatabaseBuilder(context.getApplicationContext(),AppDatabase.class).allowMainThreadQueries().build();
}
return INSTANCE;
}
public static void destroyInstance() {
INSTANCE = null;
}
}
Gradle lib:
compile "android.arch.persistence.room:runtime:+"
annotationProcessor "android.arch.persistence.room:compiler:+"
当我要求例如它会发出此错误时,AppDatabase_Impl不存在
在我的应用程序类中
public class APp extends Application {
private boolean appRunning = false;
@Override
public void onCreate() {
super.onCreate();
AppDatabase.getAppDatabase(this); //--AppDatabase_Impl does not exist
}
}
答案 0 :(得分:149)
对于使用 Kotlin 的人,请尝试在应用annotationProcessor
中将kapt
更改为build.gradle
例如:
// Extensions = ViewModel + LiveData
implementation "android.arch.lifecycle:extensions:1.1.0"
kapt "android.arch.lifecycle:compiler:1.1.0"
// Room
implementation "android.arch.persistence.room:runtime:1.0.0"
kapt "android.arch.persistence.room:compiler:1.0.0"
还记得添加apply plugin:' kotlin-kapt'到应用程序级build.gradle文件的顶部并执行清理和重建(根据https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#6)
在Android Studio中,如果在粘贴代码时或在构建过程中出现错误,请选择“构建”>“清理项目”。然后选择Build>重建项目,然后重新构建。
答案 1 :(得分:61)
只需使用
apply plugin: 'kotlin-kapt'
并保持两者兼备
annotationProcessor "android.arch.persistence.room:compiler:$rootProject.roomVersion"
kapt "android.arch.persistence.room:compiler:$rootProject.roomVersion"
修改强>
在较新版本中,不需要一次添加两个依赖项 只是使用,希望它能起作用。
kapt 'android.arch.persistence.room:compiler:1.1.1'
答案 2 :(得分:14)
我错过了这个错误
@Database(entity="{<model.class>})
确保上面注释中指定的实体模型引用特定模型类,并确保必要的注释:
@Entity(tableName = "<table_name>" ...)
已正确定义并且你很好
答案 3 :(得分:8)
这不仅仅是更新您的依赖项。确保所有Room依赖项都具有相同的版本。
implementation 'android.arch.persistence.room:rxjava2:1.1.0-alpha2'
implementation 'android.arch.persistence.room:runtime:1.1.0-alpha2'
annotationProcessor "android.arch.persistence.room:compiler:1.1.0-alpha2"
在上面的示例代码段中,我的所有Room依赖项都具有相同的版本1.1.0-alpha2
答案 4 :(得分:5)
我遇到了这个问题,因为我已经忘记了相关的依赖
implementation "android.arch.lifecycle:extensions:$archLifecycleVersion"
implementation "android.arch.persistence.room:runtime:$archRoomVersion"
annotationProcessor "android.arch.lifecycle:compiler:$archLifecycleVersion"
annotationProcessor "android.arch.persistence.room:compiler:$archRoomVersion"
添加了annotationProcessor并重建之后,问题就解决了。
答案 5 :(得分:5)
对于Kotlin开发人员
使用此:
implementation "android.arch.persistence.room:runtime:1.0.0"
kapt "android.arch.persistence.room:compiler:1.0.0"
并将apply plugin: 'kotlin-kapt'
添加到应用程序级别build.gradle
的顶部。
对于Java开发人员
implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
答案 6 :(得分:4)
我遇到了问题,因为我忘记了@Dao
注释
@Dao
public interface SearchHistoryDao {
@Query("SELECT * FROM search_history")
List<SearchHistory> getAll();
@Insert
void insertAll(SearchHistory... histories);
@Delete()
void delete(SearchHistory history);
}
答案 7 :(得分:2)
使用以下gradle链接:
compile 'android.arch.persistence.room:runtime:1.0.0-alpha9'
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0-alpha9'
您需要创建diffretn singloton类并从此处获取Appdatabase:
<强> RoomDB.java 强>
public class RoomDB {
private static RoomDB INSTANCE;
public static AppDatabase getInstance(Context context) {
if (INSTANCE == null) {
INSTANCE =
Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, Constant.DATABASE).allowMainThreadQueries().build();
//Room.inMemoryDatabaseBuilder(context.getApplicationContext(),AppDatabase.class).allowMainThreadQueries().build();
}
return INSTANCE;
}
public static void destroyInstance() {
INSTANCE = null;
}
<强> App.java 强>
public class App extends Application {
private boolean appRunning = false;
@Override
public void onCreate() {
super.onCreate();
RoomDB.getInstance(this); //This will provide AppDatabase Instance
}
答案 8 :(得分:2)
有同样的问题。实现了由Android Studio创建的新示例项目中正式说明的几个类和接口: https://developer.android.com/training/data-storage/room/
上面提到的所有解决方案均无济于事,Room并未生成根据我的数据库类所必需的_Impl文件。最终在终端中执行gradle clean build给了我通往解决方案的提示:
“警告:未向注释处理器提供模式导出目录,因此我们无法导出模式。您可以提供room.schemaLocation
注释处理器参数,也可以将exportSchema设置为false。”
我在数据库类中添加了参数exportSchema = false
@Database(entities = arrayOf(User::class), version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
然后它起作用了,在generateJava下的app模块中找到了这两个生成的文件:
我不了解此行为,因为该参数被称为可选参数,请参见 https://stackoverflow.com/a/44645943/3258117
答案 9 :(得分:2)
如果您使用kotlin类来实现数据库,则 使用
apply plugin: 'kotlin-kapt'
和
kapt "android.arch.persistence.room:compiler:1.1.1"
在gradle文件中,它将起作用。
答案 10 :(得分:1)
如果您使用的是 kotlin
,请将 kotlin 注释处理器插件添加到应用级别 build.gradle
plugins {
id "org.jetbrains.kotlin.kapt"
}
同时删除 annotationProcessor
并替换为 kapt
dependencies {
def room_version = "2.3.0"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
}
dependencies {
def room_version = "2.3.0"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
}
annotationProcessor
仅适用于 java 环境。 kapt
处理 java 和 kotlin。如果您的实现有问题,这些插件会在编译时显示出来。
答案 11 :(得分:1)
对于Kotlin开发人员
如果您检查了Dao和Entity并也使用了Kapt,并且没有问题,那么如果您使用的是Kotlin 1.4及更高版本,我想您的kotlin版本有问题。 将Room从此link更新到最新版本。
2.3.0-alpha03 解决了我的问题。
答案 12 :(得分:1)
在我的kotlin应用程序中,我只是在build.gradle文件的顶部添加了以下行:
apply plugin: 'kotlin-kapt'
以及“依赖项”部分中的以下行:
kapt "androidx.room:room-compiler:2.2.5"
我希望它可以解决您的问题。
答案 13 :(得分:1)
在gradle文件中更改依赖项并不能帮助我修复错误。我在初始化Room数据库的类中错过了此Database注释,这是导致此问题的原因。
@Database(实体= [UserModel :: class],版本= 1)
确保上面注释中指定的实体模型引用特定的模型类
答案 14 :(得分:1)
确保在build.gradle中为房间添加正确的依赖项
ext {
roomVersion = '2.1.0-alpha06'
}
// Room components
implementation "androidx.room:room-runtime:$rootProject.roomVersion"
implementation "androidx.room:room-ktx:$rootProject.roomVersion"
kapt "androidx.room:room-compiler:$rootProject.roomVersion"
androidTestImplementation "androidx.room:room-testing:$rootProject.roomVersion"
并在顶部行的下方-
apply plugin: 'kotlin-kapt'
答案 15 :(得分:1)
我也遇到了同样的现象。
关注
implementation "android.arch.persistence.room:runtime:1.1.1"
添加会导致另一个构建错误,但会从日志中跟踪原因。
就我而言,SQL实现中存在错误。 修复后,构建成功。
所以您可能要检查整个房间库的实现,而不是查看崩溃的本地人。
答案 16 :(得分:1)
就我而言,我正在测试会议室数据库的连通性,并将测试类放入了在AndroidTest文件夹中创建的目录中。我已将其移出自定义目录,然后效果很好。
答案 17 :(得分:0)
这个问题已经很老了,但是我今天偶然发现了这个问题,提供的答案都没有帮助我。最后,我设法解决了这一问题,方法是注意到Google documentation实际上仍然被Java所采用,而不是默认情况下不是Kotlin,实际上他们已经添加了我忽略的评论
对于Kotlin,请使用kapt代替注解处理器
所以,而不是
annotationProcessor "androidx.room:room-compiler:$room_version"
如果您使用Kotlin进行开发,则应使用:
kapt "androidx.room:room-compiler:$room_version"
答案 18 :(得分:0)
对我来说,一旦包含与Room数据库相关的任何导入,Android Studio就会自动更新依赖关系。但是根据https://developer.android.com/jetpack/androidx/releases/room#declaring_dependencies,您需要更新的内容很少。这是我的代码库的样子:
AppDatabase.kt
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
@Database(entities = arrayOf(MyEntity::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun myDAO(): MyDAO
companion object {
@Volatile private var instance: AppDatabase? = null
private val LOCK = Any()
operator fun invoke(context: Context)= instance ?: synchronized(LOCK){
instance ?: buildDatabase(context).also { instance = it}
}
private fun buildDatabase(context: Context) = Room.databaseBuilder(context,
AppDatabase::class.java, "db-name.db")
.build()
}
}
按照答案之一中的指定更新build.gradle:
apply plugin: 'kotlin-kapt' // this goes with other declared plugin at top
dependencies { // add/update the following in dependencies section
implementation 'androidx.room:room-runtime:2.2.3'
// annotationProcessor 'androidx.room:room-compiler:2.2.3' // remove this and use the following
kapt "androidx.room:room-compiler:2.2.3"
}
同步gradle,您应该会很好。
答案 19 :(得分:0)
在这里阅读示例: Room Example
我仅使用正确的(我猜是)annotationProcessorFile修复了此错误,如下所示:
annotationProcessor "android.arch.persistence.room:compiler:<latest_version>"
此外,我将Room版本和Lifecycle版本都升级到2.2.0。
一旦同步了渐变,我就可以开始使用Room。
那么,祝你好运!让代码随身携带!
答案 20 :(得分:0)
在OP中不是这样,但是当您错误地使用实现而不是 annotationProcessor 时,也会发生这种情况:
implementation "android.arch.persistence.room:compiler:x.x.x"
代替此:
annotationProcessor "android.arch.persistence.room:compiler:x.x.x"
答案 21 :(得分:0)
问题更多的是没有在gradle构建中包含的正确库。我遇到了类似的问题,并添加了缺少的
testImplementation“ android.arch.persistence.room:testing:$room_version
答案 22 :(得分:0)
除了失踪
annotationProcessor "android.arch.persistence.room:compiler:x.x.x"
我也错过了在我的班级中添加以下注释
@Entity(tableName = "mytablename")
答案 23 :(得分:0)
以防万一有人犯和我一样的错误,不要把你的数据库类称为“Database”,否则你会得到同样的错误。