【问题标题】:Room DataBase not implemented房间数据库未实现
【发布时间】:2017-05-24 15:39:52
【问题描述】:

我正在尝试来自 google 的 Android Architecture Components 的新 Room ORM,我遵循了文档,但是当我运行我的代码时,我得到了 java.lang.RuntimeException: cannot find implementation for com.zeyad.usecases.app.UserDatabase. UserDatabase_Impl does not exist

这是我的代码:

Gradle 项目:

allprojects {
repositories {
    jcenter()
    maven { url 'https://jitpack.io' }
    maven { url 'https://maven.google.com' }
}
}

Gradle 模块:

compile "android.arch.lifecycle:runtime:1.0.0-alpha1"
compile "android.arch.lifecycle:extensions:1.0.0-alpha1"
annotationProcessor "android.arch.lifecycle:compiler:1.0.0-alpha1"
compile "android.arch.persistence.room:runtime:1.0.0-alpha1"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha1"

用户:

@Entity(tableName = "User")
public class User {

    static final String LOGIN = "login";
    private static final String ID = "id", AVATAR_URL = "avatar_url";
    @PrimaryKey
    @SerializedName(LOGIN)
    @ColumnInfo(name = LOGIN)
    String login;

    @SerializedName(ID)
    @ColumnInfo(name = ID)
    int id;

    @SerializedName(AVATAR_URL)
    @ColumnInfo(name = AVATAR_URL)
    String avatarUrl;

    public User() {
    }

    public User(String login, int id, String avatarUrl) {
        this.login = login;
        this.id = id;
        this.avatarUrl = avatarUrl;
    }

    public static boolean isEmpty(User user) {
        return user == null || (user.login == null && user.avatarUrl == null);
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getAvatarUrl() {
        return avatarUrl;
    }

    public void setAvatarUrl(String avatarUrl) {
        this.avatarUrl = avatarUrl;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        User user = (User) o;

        return id == user.id && (login != null ? login.equals(user.login) : user.login == null
                && (avatarUrl != null ? avatarUrl.equals(user.avatarUrl) : user.avatarUrl == null));
    }

    @Override
    public int hashCode() {
        int result = login != null ? login.hashCode() : 0;
        result = 31 * result + id;
        result = 31 * result + (avatarUrl != null ? avatarUrl.hashCode() : 0);
        return result;
    }
}

用户数据库:

@Database(entities = {User.class}, version = 1)
public abstract class UserDatabase extends RoomDatabase {
    public abstract RoomBaseDao roomBaseDao();
}

RoomBaseDao:

@Dao
public interface RoomBaseDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertItemsReplace(User... objects);

    @Update(onConflict = OnConflictStrategy.REPLACE)
    void updateItemsReplace(User... objects);

    @Delete
    void deleteItem(User object);
}

应用程序创建:

UserDatabase gDb = Room.databaseBuilder(this, UserDatabase.class, "test-db").build(); // throws the exception above

提前致谢。

【问题讨论】:

  • 感觉代码没有按预期生成。您是否在 build.gradle 文件中包含了这两个依赖项?
  • 我用 gradle 依赖项更新了问题
  • 好的,看起来不错。如果您进入模块的 build/generated/source/ 目录,您是否看到带有 UserDatabase_Impl.javaRoomBaseDao_Impl.java 类的 apt/debug/ 目录(在相应的 Java 包中)?
  • 我有这个目录但是它是空的
  • 这就是问题的症结所在。假设清理和重建项目没有帮助,请检查您的 Gradle 控制台,看看是否有任何来自注释处理器的消息可以解释您的代码未生成的原因。

标签: java android android-room


【解决方案1】:

就我而言,我使用的是旧版本的 ButterKnife,它需要 android-apt 插件。所以我更新了 ButterKnife(现在使用注释处理器)并删除了 Gradle 文件中的插件声明。

可能这不完全是您的问题,但也许会对其他人有所帮助。

【讨论】:

  • 原来我还在使用 android-apt,当我删除它时,现在一切正常。
  • 我很乐意提供帮助。
【解决方案2】:

可能导致问题的另一件事:

configurations.all {
  resolutionStrategy {
    force "com.android.support:support-annotations:$SUPPORT_LIBRARY_VERSION"
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多