Android 房间持久性AppDatabase_Impl不存在

Android 房间持久性AppDatabase_Impl不存在,android,android-room,Android,Android Room,我已经为存储通知实现了Room持久化,但是对于builde implementation for modules.room_db.AppDatabase. AppDatabase_Impl does not exist at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) at android.app.ActivityThread.handleLaunchActi

我已经为存储通知实现了Room持久化,但是对于
builde

implementation for modules.room_db.AppDatabase. AppDatabase_Impl does not exist
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5001)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.RuntimeException: cannot find implementation for modules.room_db.AppDatabase. AppDatabase_Impl does not exist
        at android.arch.persistence.room.Room.getGeneratedImplementation(Room.java:92)
        at android.arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.java:454)
        at modules.room_db.AppDatabase.getAppDatabase(AppDatabase.java:23)
        at MypackageName.SplashActivity.onCreate(SplashActivity.java:46)
        at android.app.Activity.performCreate(Activity.java:5231)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
店铺通知

AppDatabase.getAppDatabase(getApplicationContext()).userDao().insertNotification(notificationDetail);
Gralde

 implementation 'android.arch.persistence.room:runtime:1.0.0'
    annotationProcessor    'android.arch.persistence.room:compiler:1.0.0'
    androidTestImplementation 'android.arch.persistence.room:testing:1.0.0'
AppDatabase.java

public abstract class AppDatabase extends RoomDatabase {

    private static final String DATABASE_NAME = "notification_room_db";

    public abstract NotificationDao userDao();


    private static AppDatabase INSTANCE;

    public static AppDatabase getAppDatabase(Context context) {
        if (INSTANCE == null) {
            INSTANCE =
                    Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME)
                            // allow queries on the main thread.
                            // Don't do this on a real app! See PersistenceBasicSample for an example.
                            .allowMainThreadQueries()
                            .build();
        }
        return INSTANCE;
    }

    public static void destroyInstance() {
        INSTANCE = null;
    }
}
public interface NotificationDao {


    @Query("SELECT * FROM notifications")
    List<NotificationDetail> getAll();

    @Query("SELECT * FROM notifications WHERE notification_id IN (:userIds)")
    List<NotificationDetail> loadAllByIds(int[] userIds);


    @Insert
    void insertNotification(NotificationDetail... users);


    @Update
    void updateNotification(NotificationDetail notificationDetail);

    @Delete
    void delete(NotificationDetail user);
}
@Entity(tableName = "notifications")
public class NotificationDetail {

    @PrimaryKey(autoGenerate = true)
    private int notification_id;

    @ColumnInfo(name = "message")
    private String message;

    @ColumnInfo(name = "title")
    private String title;

    @ColumnInfo(name = "type")
    private String type;

    @ColumnInfo(name = "order_id")
    private int order_id;

    @ColumnInfo(name = "is_displayed")
    private boolean isSeen;

}
NotificationDao.java

public abstract class AppDatabase extends RoomDatabase {

    private static final String DATABASE_NAME = "notification_room_db";

    public abstract NotificationDao userDao();


    private static AppDatabase INSTANCE;

    public static AppDatabase getAppDatabase(Context context) {
        if (INSTANCE == null) {
            INSTANCE =
                    Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME)
                            // allow queries on the main thread.
                            // Don't do this on a real app! See PersistenceBasicSample for an example.
                            .allowMainThreadQueries()
                            .build();
        }
        return INSTANCE;
    }

    public static void destroyInstance() {
        INSTANCE = null;
    }
}
public interface NotificationDao {


    @Query("SELECT * FROM notifications")
    List<NotificationDetail> getAll();

    @Query("SELECT * FROM notifications WHERE notification_id IN (:userIds)")
    List<NotificationDetail> loadAllByIds(int[] userIds);


    @Insert
    void insertNotification(NotificationDetail... users);


    @Update
    void updateNotification(NotificationDetail notificationDetail);

    @Delete
    void delete(NotificationDetail user);
}
@Entity(tableName = "notifications")
public class NotificationDetail {

    @PrimaryKey(autoGenerate = true)
    private int notification_id;

    @ColumnInfo(name = "message")
    private String message;

    @ColumnInfo(name = "title")
    private String title;

    @ColumnInfo(name = "type")
    private String type;

    @ColumnInfo(name = "order_id")
    private int order_id;

    @ColumnInfo(name = "is_displayed")
    private boolean isSeen;

}

我已经搜索过了,还有同样的问题,因为我正在android中寻找答案。

当我们使用
房间持久性时,最好为每个类定义适当的注释

1) 使用注释
@Entity
定义您的
实体
类,如下所示

@Entity(tableName = "notifications")
public class NotificationDetail {

    @PrimaryKey(autoGenerate = true)
    private int notification_id;

    @ColumnInfo(name = "message")
    private String message;

    @ColumnInfo(name = "title")
    private String title;             
}
@Dao
public interface NotificationDao {

    @Query("SELECT * FROM notifications")
    List<NotificationDetail> getAll();

    @Insert
    void insertNotification(NotificationDetail... users);

    @Update
    void updateNotification(NotificationDetail notificationDetail);

    @Delete
    void delete(NotificationDetail user);
}
@Database(entities = {NotificationDetail.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {

    private static final String DATABASE_NAME = "notification_room_db";

    public abstract NotificationDao userDao();


    private static AppDatabase INSTANCE;

    public static AppDatabase getAppDatabase(Context context) {
        if (INSTANCE == null) {
            INSTANCE =
                    Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME)
                            // allow queries on the main thread.
                            // Don't do this on a real app! See PersistenceBasicSample for an example.
                            .allowMainThreadQueries()
                            .build();
        }
        return INSTANCE;
    }

    public static void destroyInstance() {
        INSTANCE = null;
    }
}
2) 使用
@Dao
注释定义Dao接口,如下所示

@Entity(tableName = "notifications")
public class NotificationDetail {

    @PrimaryKey(autoGenerate = true)
    private int notification_id;

    @ColumnInfo(name = "message")
    private String message;

    @ColumnInfo(name = "title")
    private String title;             
}
@Dao
public interface NotificationDao {

    @Query("SELECT * FROM notifications")
    List<NotificationDetail> getAll();

    @Insert
    void insertNotification(NotificationDetail... users);

    @Update
    void updateNotification(NotificationDetail notificationDetail);

    @Delete
    void delete(NotificationDetail user);
}
@Database(entities = {NotificationDetail.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {

    private static final String DATABASE_NAME = "notification_room_db";

    public abstract NotificationDao userDao();


    private static AppDatabase INSTANCE;

    public static AppDatabase getAppDatabase(Context context) {
        if (INSTANCE == null) {
            INSTANCE =
                    Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME)
                            // allow queries on the main thread.
                            // Don't do this on a real app! See PersistenceBasicSample for an example.
                            .allowMainThreadQueries()
                            .build();
        }
        return INSTANCE;
    }

    public static void destroyInstance() {
        INSTANCE = null;
    }
}

我忘了在数据库类中添加@Database annotation

您是否在另一个项目中为Room添加gradle依赖项,就像另一个图书馆项目一样?@AkshayChordiya不,这是主项目,这意味着您只有一个名为“app”的模块,其中包含Room gradle依赖项。对吗?@AkshayChordiya是的,我在你的项目中只有一个模块“app”,你用@Dao注释了你的NotificationDao.java吗?因为您在这里错过了它。@Maksim Kniazev发布了您使用的更多详细信息和代码,通过向实体类添加空构造函数解决了此问题