房间:传递列名称为DAO方法中的参数

时间:2017-12-30 22:08:56

标签: android android-room

我使用Room从我的本地Android sqlite数据库查询表。

我已经创建了一个抽象类Dao,并想知道我是否可以将列名作为参数传递给方法,如下所示:

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

3 个答案:

答案 0 :(得分:1)

不,抱歉,不支持。 Room仅支持SQLite的功能,而SQLite不支持列名,表名等参数。

答案 1 :(得分:1)

是的,@Query 不支持。 但是您可以使用 @RawQuery 来完成您的工作。

@RawQuery

文档说

<块引用>

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

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

答案 2 :(得分:0)

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";
   }
}

或使用枚举代替字符串。