android 如何从动态列名中获取数据

qltillow  于 2023-05-12  发布在  Android
关注(0)|答案(1)|浏览(122)

我正在使用房间数据库,并在下面的查询中卡住了。

@Query("SELECT * FROM POI WHERE :columName IN (:fieldValue) ORDER BY ABS(Latitude - :latitude) + ABS(Longitude - :longitude) ASC LIMIT :limit")
List<PoiItems> getNearByLocation(String columName, List<String> fieldValue, double latitude, double longitude, int limit);

当我执行上面的查询时,它没有给我任何记录。我认为问题在于动态列名。因为当我传递静态列名时,它会给我记录。
那么有没有解决的办法呢?
任何帮助将不胜感激。

bkhjykvo

bkhjykvo1#

当您将参数传递给@Query时,该值由SQLite接口绑定。SQLite不允许标识符的绑定值(例如表、列、视图名称)。因此,不是将列与值列表进行比较,而是将传递的列名的值作为文字值与值列表进行比较。
有两种方法可以做到这一点

  • 则需要CASEWHEN THEN ELSEEND构造,并且这将依赖于潜在值的数量。类似于(假设3个可能的列为col 1、col 2和col 3)

:-

SELECT * FROM POI WHERE 
    CASE 
        WHEN :columnName /*<<<<< passed value */ = 'col1' THEN col1 IN (:fieldValue) 
        WHEN :columnName /*<<<<< passed value */ = 'col2' THEN col2 IN (:fieldValue)
        WHEN :columnName /*<<<<< passed value */ = 'col3' THEN col3 IN (:fieldValue)
    END
ORDER BY ABS(Latitude - :latitude) + ABS(Longitude - :longitude) ASC LIMIT :limit
;
  • 另一种是使用@RawQuery,其中在查询字符串中替换列名。这种方法的缺点是在编译时不检查结果SQL,因此更容易出现运行时错误。然而,就SQL而言,它通常是更简单的方法。
  • 你可能会发现这很有用

相关问题