如何在 Room @Query 中使用参数字段?

mFe*_*ein 27 android android-room

我有一个User带有字段的类id,所以我想用 Room 运行以下查询:

@Query("SELECT * FROM ticket where user_id = :user.id")
LiveData<Ticket> loadFromUser(User user);
Run Code Online (Sandbox Code Playgroud)

但是我在 Android Studio on 上收到错误标记,user.id并且我在网上找到的所有示例仅使用该@Query方法的直接参数,通常是 aString或 an int

是否可以在 Room 中使用对象的字段@Query?如果是肯定的,那么引用它的正确方法是什么。

Nir*_*ode 27

你不能把这样的参数传递给房间。它不支持完整的表达式语言。您必须使用原始类型来传递参数。像这样,

@Query("SELECT * FROM ticket where user_id = :user_id")
LiveData<Ticket> loadFromUser(String user_id);
Run Code Online (Sandbox Code Playgroud)

  • 很遗憾没有这样的支持:( (5认同)

T D*_*yen 8

一个简单的解决方案是创建另外两个函数,一个是 for user_id,一个是 for ,user如下所示:

@Query("SELECT * FROM ticket where user_id = :user_id")
LiveData<Ticket> loadFromUser(String user_id);

@Transaction
LiveData<Ticket> loadFromUser(User user){
   return loadFromUser(user.id);
}
Run Code Online (Sandbox Code Playgroud)


Moj*_*adi 5

就我而言,我用过@RawQuery

在DAO中你可以写

@RawQuery
LiveData<Ticket> loadFromUser(SupportSQLiteQuery query);
Run Code Online (Sandbox Code Playgroud)

并创建您的查询并传递给它。

SimpleSQLiteQuery query  = new SimpleSQLiteQuery("SELECT * FROM ticket where user_id = ?") , new Object[]{user.id})
Run Code Online (Sandbox Code Playgroud)

并将其传递query给 DAO 方法。

userDao.loadFromUser(query)
Run Code Online (Sandbox Code Playgroud)

  • 这无缘无故地复杂得多,只需使用其他解决方案 (2认同)