Room: pass columns Name as parameter in DAO Method

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-23 17:07:05

问题


I m using Room to query a table from my local Android sqlite database.

I've created an abstract class Dao , and wondering if i can pass the name of columns as parameters in method like this :

@Query(value = "SELECT :columnName "
        + " from " + Constant.TABLE_NAME
)
public abstract Maybe<List<SomeEntity>> getResults(String columnName);

回答1:


No, sorry, that is not supported. Room only supports what SQLite does, and SQLite does not support parameters for column names, table names, etc.




回答2:


Can be done example at How to select a specific column from room database given a specific parameter in room query?

it does ok

@Query("WITH parms(c) AS (SELECT :columnName) " +
        "SELECT  COALESCE(" +
        "CASE " +
        "WHEN (SELECT c FROM parms) = 'column1' THEN column1 " +
        "WHEN (SELECT c FROM parms) = 'column2' THEN column2 " +
        "WHEN (SELECT c FROM parms) = 'column3' THEN column3 " +
        "WHEN (SELECT c FROM parms) = 'column4' THEN column4 " +
        "END" +
        ",0) AS subcategoryValue " +
        "FROM subcategory_table" +
        ";")
float[] getSubcategory(String columnName);

or more harder like SQL at DB Fiddle become

Using

@Query("WITH parms(c1,c2,c3,c4) AS (SELECT :c1,:c2,:c3,:c4)" +
        "SELECT * FROM subcategory_table WHERE " +
        " CASE " +
        "           WHEN " +
        "               (SELECT c1 FROM parms) IS NOT NULL " +
        "               AND (SELECT c2 FROM parms) IS NULL " +
        "               AND (SELECT c3 FROM parms) IS NULL " +
        "               AND (SELECT c4 FROM parms) IS NULL" +
        "           THEN column1 = (SELECT c1 FROM parms)" +
        "           WHEN " +
        "               (SELECT c1 FROM parms) IS NOT NULL " +
        "               AND (SELECT c2 FROM parms) IS NOT NULL " +
        "               AND (SELECT c3 FROM parms) IS NULL " +
        "               AND (SELECT c4 FROM parms) IS NULL " +
        "           THEN column1 = (SELECT c1 FROM parms) AND column2 = (SELECT c2 FROM parms)" +
        "           WHEN " +
        "               (SELECT c1 FROM parms) IS NULL " +
        "               AND (SELECT c2 FROM parms) IS NOT NULL " +
        "               AND (SELECT c3 FROM parms) IS NULL " +
        "               AND (SELECT c4 FROM parms) IS NULL " +
        "           THEN column2 = (SELECT c2 FROM parms) " +
        "           WHEN " +
        "               (SELECT c1 FROM parms) IS NOT NULL " +
        "               AND (SELECT c2 FROM parms) IS NOT NULL " +
        "               AND (SELECT c3 FROM parms) IS NOT NULL " +
        "               AND (SELECT c4 FROM parms) IS NULL " +
        "           THEN column2 = (SELECT c2 FROM parms) AND column2 = (SELECT c2 FROM parms) AND (SELECT c3 FROM parms)" +
        "           WHEN " +
        "               (SELECT c1 FROM parms) IS NOT NULL " +
        "               AND (SELECT c2 FROM parms) IS NULL " +
        "               AND (SELECT c3 FROM parms) IS NOT NULL " +
        "               AND (SELECT c4 FROM parms) IS NULL " +
        "           THEN column1 = (SELECT c1 FROM parms) AND column3 = (SELECT c3 FROM parms)" +
        "           WHEN " +
        "               (SELECT c1 FROM parms) IS NULL " +
        "               AND (SELECT c2 FROM parms) IS NOT NULL " +
        "               AND (SELECT c3 FROM parms) IS NOT NULL " +
        "               AND (SELECT c4 FROM parms) IS NULL " +
        "           THEN column2 = (SELECT c2 FROM parms) AND column3 = (SELECT c3 FROM parms)" +
        "           WHEN " +
        "               (SELECT c1 FROM parms) IS NULL " +
        "               AND (SELECT c2 FROM parms) IS NULL " +
        "               AND (SELECT c3 FROM parms) IS NOT NULL " +
        "               AND (SELECT c4 FROM parms) IS NULL " +
        "           THEN column3 = (SELECT c3 FROM parms) " +
        "           WHEN " +
        "               (SELECT c1 FROM parms) IS NULL " +
        "               AND (SELECT c2 FROM parms) IS NULL " +
        "               AND (SELECT c3 FROM parms) IS NULL " +
        "               AND (SELECT c4 FROM parms) IS NOT NULL" +
        "           THEN  column4 = (SELECT c4 FROM parms)" +
        "           WHEN \n" +
        "               (SELECT c1 FROM parms) IS NOT NULL " +
        "               AND (SELECT c2 FROM parms) IS NULL " +
        "               AND (SELECT c3 FROM parms) IS NULL " +
        "               AND (SELECT c4 FROM parms) IS NOT NULL " +
        "           THEN  column1 = (SELECT c1 FROM parms) AND column4 = (SELECT c4 FROM parms) " +
        "           WHEN " +
        "               (SELECT c1 FROM parms) IS NOT NULL " +
        "               AND (SELECT c2 FROM parms) IS NOT NULL " +
        "               AND (SELECT c3 FROM parms) IS NULL " +
        "               AND (SELECT c4 FROM parms) IS NOT NULL " +
        "           THEN  column1 = (SELECT c1 FROM parms) AND column2 = (SELECT c2 FROM parms) AND column4 = (SELECT c4 FROM parms)" +
        "           WHEN \n" +
        "               (SELECT c1 FROM parms) IS NOT NULL " +
        "               AND (SELECT c2 FROM parms) IS NULL " +
        "               AND (SELECT c3 FROM parms) IS NOT NULL " +
        "               AND (SELECT c4 FROM parms) IS NOT NULL " +
        "           THEN  column1 = (SELECT c1 FROM parms) AND column3 = (SELECT c3 FROM parms) AND column4 = (SELECT c4 FROM parms) " +
        "           WHEN " +
        "               (SELECT c1 FROM parms) IS NOT NULL " +
        "               AND (SELECT c2 FROM parms) IS NOT NULL " +
        "               AND (SELECT c3 FROM parms) IS NULL " +
        "               AND (SELECT c4 FROM parms) IS NOT NULL " +
        "           THEN  column1 = (SELECT c1 FROM parms) AND column3 = (SELECT c3 FROM parms) AND column4 = (SELECT c4 FROM parms) " +
        "           WHEN " +
        "               (SELECT c1 FROM parms) IS NOT NULL " +
        "               AND (SELECT c2 FROM parms) IS NOT NULL " +
        "               AND (SELECT c3 FROM parms) IS NOT NULL " +
        "               AND (SELECT c4 FROM parms) IS NOT NULL " +
        "           THEN  column1 = (SELECT c1 FROM parms) AND column2 = (SELECT c2 FROM parms) AND column3 = (SELECT c3 FROM parms) AND column4 = (SELECT c4 FROM parms) " +
        "           WHEN " +
        "               (SELECT c1 FROM parms) IS NULL \n" +
        "               AND (SELECT c2 FROM parms) IS NOT NULL " +
        "               AND (SELECT c3 FROM parms) IS NOT NULL " +
        "               AND (SELECT c4 FROM parms) IS NOT NULL " +
        "           THEN  column2 = (SELECT c2 FROM parms) AND column3 = (SELECT c3 FROM parms) AND column4 = (SELECT c4 FROM parms) " +
        "           WHEN \n" +
        "               (SELECT c1 FROM parms) IS NULL " +
        "               AND (SELECT c2 FROM parms) IS NOT NULL " +
        "               AND (SELECT c3 FROM parms) IS NULL " +
        "               AND (SELECT c4 FROM parms) IS NOT NULL " +
        "           THEN  column2 = (SELECT c2 FROM parms) AND column4 = (SELECT c4 FROM parms) " +
        "           WHEN \n" +
        "               (SELECT c1 FROM parms) IS NULL " +
        "               AND (SELECT c2 FROM parms) IS NULL " +
        "               AND (SELECT c3 FROM parms) IS NOT NULL " +
        "               AND (SELECT c4 FROM parms) IS NOT NULL" +
        "           THEN  column3 = (SELECT c3 FROM parms) AND column4 = (SELECT c4 FROM parms)" +
        "           ELSE column1 = column1" +
        "       END" +
        ";")
List<SubcategoryTable> getAccordingToColumnvalues(String c1, String c2, String c3, String c4);

Used like

    subcategoryTableList = subcategoryTableDao.getAccordingToColumnvalues("13",null,null,null);

This show why this method not very good, it CASEs go up by square factor.



来源:https://stackoverflow.com/questions/48038299/room-pass-columns-name-as-parameter-in-dao-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!