问题描述
根据 https://developer.android.com/training/data-储物/房间/关系
我们可以建立一对多的关系
We can have one-to-many relationships
public class UserWithPlaylists {
@Embedded public User user;
@Relation(
parentColumn = "userId",
entityColumn = "userCreatorId"
)
public List<Playlist> playlists;
}
@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();
在实体 User
和 Playlist
中,我们添加了名为 sort_key
In both entity User
and Playlist
, we have added a column named sort_key
目的是,当我们执行查询时,我们可以执行以下操作
The purpose is, when we perform query, we can do the following
@Transaction
@Query("SELECT * FROM User order by sort_key")
public List<UserWithPlaylists> getUsersWithPlaylists();
我们可以控制 List< UserWithPlaylists>
的顺序.
但是, List< Playlist>怎么样?播放列表
子实体?
我们如何为子实体 Playlist
定义自定义查询,以便我们可以控制 List< Playlist>播放列表
排序?
How can we define a custom query for child entity Playlist
, so that we can have control over List<Playlist> playlists
ordering?
推荐答案
恐怕这里没有开箱即用的方式.
I'm afraid there is no out-of-box way here.
使用 @Relation 注释,您所拥有的就是:
Using @Relation annotation all you have is:
-
5个注释的参数(associateBy ,实体, entityColumn ,父列,投影.它们都不影响顺序子表的项目)
5 annotation's parameters (associateBy, entity, entityColumn, parentColumn, projection. None of them has influence on order of child table's items)
关系部门内部,房间使用两个查询-首先,您明确地在DAO中编写
Under the Relation's hood Room uses two queries - first you explicitly write in your DAO
SELECT * FROM User order by sort_key
和另一个-用于从子表中获取数据(基于查询结果的类型和 @Relation 参数):
and another - for fetching data from the child table (based on type of query's result and on @Relation parameters):
SELECT * FROM PlayList WHERE userCreatorId IN (<List of users id from the first query>)
此查询是自动生成的,并且您的 @Relation 注释没有选项来更改项目的顺序.
This query is autogenerated and you @Relation annotation has no options to change item's order in it.
当然,获得此无序"结果后,您可以添加一些后处理以手动实现所需的功能
Of course, after getting this "unordered" result you can add some post-processing to achieve what you want manually
这篇关于使用一对多关系时,是否可以控制子实体的顺序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!