Room:在 DAO 方法中将列名称作为参数传递

Room: pass columns Name as parameter in DAO Method

我正在使用 Room 从本地 Android sqlite 数据库查询 table。

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

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

不,抱歉,不支持。 Room 仅支持 SQLite 所做的,SQLite 不支持列名、table 名称等参数

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

或使用枚举代替字符串。

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

@RawQuery

文档说

RawQuery methods can only be used for read queries. For write queries, use RoomDatabase.getOpenHelper().getWritableDatabase().

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