两个表使用一个实体

时间:2018-06-08 21:57:06

标签: android sql database

我的问题涉及房间和桌子。 我有一个名为movie的POJO,此POJO包含titleimageoverviewreleaseDaterating

movie被输入为@Entity(tableName = movie_table),此表格包含由http调用查询的最受欢迎的电影:/movie/popular端点,我被要求使用过滤器按钮从最受欢迎的电影切换到最受欢迎的电影,第二个过滤器使用另一个http调用:/movie/top_rated端点。基于此我需要不同的表,可能有一个叫做most_popular_movies,另一个名为top_rated_movies。如何只使用一个实体来实现这一目标?我需要复制movie POJO吗?或者是否有另一种使用这两种不同的http调用实现此过滤的方法?

非常感谢!!

1 个答案:

答案 0 :(得分:1)

无需创建多个表。您可以在表格中再添加两列,即rank_most_popularrank_top_rated。然后,当您获取大多数热门电影时,您将使用您指定的排名将它们插入到数据库中。然后,当您获取评分最高的电影时,您只需将新电影插入数据库并更新已分配最高评级排名的现有电影。然后,您可以编写查询以过滤所需的查询。这些方面的东西。

实体类

@Entity(tableName = "movie_table")
public class MovieEntity {

    @PrimaryKey
    private long id;

    private int topRatedRank;
    private int mostPopularRank;

    // Other fields...

}

Dao班

@Dao
public interface MovieDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insert(MovieEntity movie);

    @Update
    int update(MovieEntity entity);

    @Query("SELECT * FROM movie_table WHERE mostPopularRank <> -1 ORDER BY mostPopularRank ASC LIMIT :count")
    List<MovieEntity> getMostPopular(int count);

    @Query("SELECT * FROM movie_table WHERE topRatedRank <> -1 ORDER BY topRatedRank ASC LIMIT :count")
    List<MovieEntity> getTopRated(int count);

    @Query("SELECT * FROM movie_table WHERE :id = id")
    MovieEntity getById(long id);

}

当你收到电影时,你只需为每部电影分配一个等级(类似于最高评级)

public void mostPopularReceived(List<MovieEntity> mostPopular) {
    for (int i = 0; i < mostPopular.size(); i++) {
        MovieEntity movie = mostPopular.get(i);
        MovieEntity dbMovie = movieDao.getById(movie.getId());
        if (dbMovie == null) {
            movie.setMostPopularRank(i);
            movieDao.insert(movie);
        } else {
            dbMovie.setMostPopularRank(i);
            movieDao.update(dbMovie);
        }
    }
}