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

42

我有一个User类,其中包含一个id字段,所以我想在Room中运行以下查询:

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

但是在Android Studio上,user.id上出现了错误标记,而我在网上找到的所有示例只使用@Query方法的直接参数,通常是一个Stringint

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


2
这将是一个非常需要的功能,特别是在您需要使用类的大量成员的情况下。 - AndrewBloom
3个回答

54

您不能像那样将参数传递给 room。它不支持完整的表达式语言。您必须使用基本类型来传递参数。像这样:

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

10
很遗憾,没有这样的支持 :( - Daniel
我觉得Room非常局限。我发现将Json查询存储起来,稍后再解析它似乎比使用Room更容易。 - JPM
1
您可以按照以下方式添加带有对象参数的自定义方法:default LiveData<Ticket> loadFromUser(User user){ return loadFromUser(user.id); } - Jörg Eisfeld
字符串不是原始类型! - Seyyed

8
一个简单的解决方案是创建两个其他函数,一个是用于 user_id,另一个是用于 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);
}

5
在我的情况下,我使用了@RawQuery
在DAO中,您可以编写:
@RawQuery
LiveData<Ticket> loadFromUser(SupportSQLiteQuery query);

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

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

并将这个查询传递给DAO方法。

userDao.loadFromUser(query)

2
这样做更加复杂,没有必要,只需使用另一种解决方案。 - Michel Feinstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接