使用一对多关系时,有没有办法控制子实体的顺序?

Che*_*eng 7 java android android-room

根据https://developer.android.com/training/data-storage/room/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();
Run Code Online (Sandbox Code Playgroud)

在 entityUser和 中Playlist,我们添加了一个名为的列sort_key

目的是,当我们执行查询时,我们可以做到以下几点

@Transaction
@Query("SELECT * FROM User order by sort_key")
public List<UserWithPlaylists> getUsersWithPlaylists();
Run Code Online (Sandbox Code Playgroud)

我们可以控制 的顺序List<UserWithPlaylists>

但是,List<Playlist> playlists子实体呢?

我们如何为子实体定义自定义查询Playlist,以便我们可以控制List<Playlist> playlists排序?

ser*_*nov 7

我们如何为子实体播放列表定义自定义查询,以便我们可以控制列表播放列表的排序?

恐怕这里没有开箱即用的方法。

使用@Relation注释,您所拥有的只是:

  • 5个注解参数associateByentityentityColumnparentColumnprojection。它们都不影响子表项的顺序)

  • 在关系的引擎盖下 Room 使用两个查询 - 首先你明确地写在你的 DAO 中

SELECT * FROM User order by sort_key
Run Code Online (Sandbox Code Playgroud)

另一个 - 用于从子表中获取数据(基于查询结果的类型和@Relation参数):

SELECT * FROM PlayList WHERE userCreatorId IN (<List of users id from the first query>)
Run Code Online (Sandbox Code Playgroud)

此查询是自动生成的,您的@Relation注释无法更改其中项目的顺序。

当然,在得到这个“无序”结果后,你可以添加一些后处理来手动实现你想要的