Room @Query错误:无法找到方法参数

时间:2018-01-04 17:08:45

标签: java android android-room android-architecture-components

在我的项目中,我有一个库模块和一个使用它的应用程序模块。在这两个模块中,我对Android架构组件库具有相同的gradle依赖关系:

// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.0.0"
implementation "android.arch.lifecycle:common-java8:1.0.0"

// Room
implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"

在我的库模块中,我定义了一个用户实体

@Entity(tableName = "users",
    indices = {@Index(value = {"firstName", "lastName"})})
public class User {

public enum ROLE {
    ...
}

public enum FEEDBACK_LEVEL {
    ...
}

@PrimaryKey
public int id;

@TypeConverters(UserConverters.class)
ROLE role;

@TypeConverters(UserConverters.class)
FEEDBACK_LEVEL feedbackLevel;

public String firstName;

public String lastName;


public int getId() {
    return id;
}

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

public ROLE getRole() {
    return role;
}

public void setRole(ROLE role) {
    this.role = role;
}

public FEEDBACK_LEVEL getFeedbackLevel() {
    return feedbackLevel;
}

public void setFeedbackLevel(FEEDBACK_LEVEL feedbackLevel) {
    this.feedbackLevel = feedbackLevel;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}
}

和相关的DAO接口

@Dao
public interface UserDAO {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertUser(User ... u);

    @Query("select * from users where users.id = :userId")
    LiveData<User> getUser(int userId);
}

在我的应用程序模块中,我创建了我的数据库,其中我正在使用库项目中定义的实体

@Database(entities = {User.class}, version = 1)
public abstract class TDatabase extends RoomDatabase{
    private static TDatabase sInstance;

    public static TDatabase getInstance(final Context c) {
        if(sInstance == null)
            sInstance = Room.databaseBuilder(c, TDatabase.class, "t_db").build();
        return sInstance;
    }

    public abstract UserDAO userDao();
}

问题是,当我尝试使用其名称在@Query语句中引用方法参数时,我收到以下错误

  

错误:查询中的每个绑定变量都必须具有匹配的方法参数。无法找到以下方法参数:userId。

如果我从

更改@Query
@Query("select * from users where users.id = :userId")
LiveData<User> getUser(int userId);

@Query("select * from users where users.id = :arg0")
LiveData<User> getUser(int userId);
一切正常。

我是否犯了一些错误?为什么我收到此错误? 我用谷歌搜索了一个解决方案,但我发现在使用Java时只有Kotlin的结果。

3 个答案:

答案 0 :(得分:3)

此问题在https://issuetracker.google.com/issues/68118746报告并在版本1.1.0-alpha3中修复,但仅适用于Kotlin代码,因为参数名称始终存储在Kotlin类元数据中。

对于Java,只有:arg0的解决方法才能将NamedArg之类的注释添加到Room。

答案 1 :(得分:1)

我认为你应该这样使用它:

@Query("select * from users where id = (:userId)")
LiveData<User> getUser(int userId);

答案 2 :(得分:0)

有时在处理 db 逻辑时仍然会出现这个问题,但 "Clean Project" 通常会在 IntelliJ IDEA 中修复它(在 Android Studio 中应该也一样)。