【问题标题】:Room: pass columns Name as parameter in DAO MethodRoom:在 DAO 方法中将列名称作为参数传递
【发布时间】:2017-12-30 22:08:56
【问题描述】:

我正在使用 Room 从我的本地 Android sqlite 数据库中查询一个表。

我创建了一个抽象类 Dao,想知道我是否可以像这样将 列名称 作为 方法中的参数 传递:

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

【问题讨论】:

    标签: android android-room


    【解决方案1】:

    不,抱歉,不支持。 Room只支持SQLite做的,SQLite不支持列名、表名等参数。

    【讨论】:

    • 所以假设我有一个像这样的表模式:TABLE "TABLE_NAME" (FIELD0 TEXT NOT NULL, FIELD1 TEXT) 我无法在查询中获取第一列 (FIELD0) 元素,但是在我的 DAO 中使用它作为参数?我认为这是可能的......房间在查询中接受参数,但我的问题是我是否可以让选定的列名称也作为参数传递!???
    • @issamux:“我的问题是我是否可以让选定的列名称也作为参数传递!?” -- 不,抱歉,不支持。
    【解决方案2】:

    是的,@Query 不支持它。 但是你可以使用@RawQuery 来做你的事情。

    @RawQuery

    文档说

    RawQuery 方法只能用于读取查询。对于写查询, 使用 RoomDatabase.getOpenHelper().getWritableDatabase()。

    使用RoomDatabase.getOpenHelper().getWritableDatabase() 进行写操作。

    【讨论】:

    • 是的,RawQuery 可以完成这项工作,谢谢@Bharatesh
    【解决方案3】:

    Room 在编译时验证 SQL 查询,因此它必须知道最终的列名。 但是使用更多代码,您也许可以解决这个问题:

    @Query(value = "SELECT " + Constant.COLUMN_A_NAME
            + " from " + Constant.TABLE_NAME
    )
    public abstract Maybe<List<SomeEntity>> getResultsFromA();
    
    @Query(value = "SELECT " + Constant.COLUMN_B_NAME
            + " from " + Constant.TABLE_NAME
    )
    public abstract Maybe<List<SomeEntity>> getResultsFromB();
    
    public Maybe<List<SomeEntity>> getResults(String columnName) {
       switch (columnName) {
         case Constant.COLUMN_A_NAME:
            return getResultsFromA();
         case Constant.COLUMN_B_NAME:
            return getResultsFromB();
         default:
            throw "Invalid Column";
       }
    }
    

    或使用枚举代替字符串。

    【讨论】:

      猜你喜欢
      • 2014-02-09
      • 2014-07-14
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多