【问题标题】:Dynamic Order By using Room使用房间的动态订单
【发布时间】:2018-07-15 11:35:24
【问题描述】:

我想使用 room 创建一个动态查询,以便在一种情况下查询返回特定的订单类型,并且在运行时如果订单类型发生更改,则会创建一个新查询并根据此类型排序返回数据。

我正在使用 Room 返回一个 DataSource.Factory 对象。 我正在使用以下语句来处理我的查询:-

if(getSortOrderType().equals(context.getString(R.string.sortByPopular))) {
        dbSortType = "popularity";
    } else {
        dbSortType = "vote_average";
    }

movieLiveData =
            new LivePagedListBuilder<>(MovieDatabase
                    .getMovieDbInstance(context)
                    .getMovieDao().getAllMovies(new
                            SimpleSQLiteQuery("SELECT * FROM main_movie ORDER BY ? DESC",
                            new Object[]{dbSortType})), config)
                    .setBoundaryCallback(movieModelBoundaryCallback)
                    .build();

但是,在运行时我看到返回的数据是按已经设置的主键即 id 排序的,而不是根据我在上述语句中构建的这种类型。

如何使用该语句返回按所选排序类型排序的结果。

使用的道法是:-

@RawQuery(observedEntities = MovieModel.class)
DataSource.Factory<Integer,MovieModel> getAllMovies(SupportSQLiteQuery query);

【问题讨论】:

  • 我怀疑? 不能在ORDER BY 子句中使用。

标签: android android-sqlite android-room


【解决方案1】:

好的,我已经找到了一个简单的答案。

我刚刚替换了语句—— new SimpleSQLiteQuery("SELECT * FROM main_movie ORDER BY ? DESC", new Object[]{dbSortType})

到这里:-

new SimpleSQLiteQuery("SELECT * FROM main_movie ORDER BY "+ dbSortType + " DESC"))

【讨论】:

    【解决方案2】:

    首先检查你的 DAO 中的 getAllMovies 函数是这样的:

    @RawQuery
        fun getAllMovies(query: SupportSQLiteQuery): List<MainMovie>
    

    如果您的返回类型是可观察的类型,例如 liveData、PagingSource 等:

    @RawQuery(observedEntities = [MainMovie::class])
     fun getAllMovies(query: SupportSQLiteQuery): PagingSource<Int, MainMovie>
    

    然后使用这个:

    val myQuery=SimpleSQLiteQuery("SELECT * FROM main_movie ORDER BY "+ dbSortType + " DESC")
    getMovieDao(). getAllMovies(myQuery)
    

    【讨论】:

      猜你喜欢
      • 2017-05-10
      • 2021-11-07
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多