har*_*ara 6 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"
Run Code Online (Sandbox Code Playgroud)
在我的库模块中,我定义了一个 User 实体
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
以及相关的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);
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序模块中,我创建了我的数据库,我在其中使用了库项目中定义的实体
@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();
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我尝试@Query使用其名称在语句中引用方法参数时,出现以下错误
错误:查询中的每个绑定变量都必须有一个匹配的方法参数。找不到 :userId 的方法参数。
如果我改变@Query从
@Query("select * from users where users.id = :userId")
LiveData<User> getUser(int userId);
Run Code Online (Sandbox Code Playgroud)
到
@Query("select * from users where users.id = :arg0")
LiveData<User> getUser(int userId);
Run Code Online (Sandbox Code Playgroud)
一切正常。
我做错了吗?为什么我收到这个错误?我在谷歌上搜索了一个解决方案,但在我使用 Java 时我发现只有参考 Kotlin 的结果。
此问题在https://issuetracker.google.com/issues/68118746中报告,并在版本 1.1.0-alpha3 中修复,但仅适用于 Kotlin 代码,因为参数名称始终存储在 Kotlin 类元数据中。
对于 Java,只有一个解决方法,:arg0直到像NamedArg这样的注释被添加到 Room 中。
| 归档时间: |
|
| 查看次数: |
2246 次 |
| 最近记录: |