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 methods can only be used for read queries. For write queries,
use RoomDatabase.getOpenHelper().getWritableDatabase().
使用 RoomDatabase.getOpenHelper().getWritableDatabase()
进行写操作。
我正在使用 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 methods can only be used for read queries. For write queries, use RoomDatabase.getOpenHelper().getWritableDatabase().
使用 RoomDatabase.getOpenHelper().getWritableDatabase()
进行写操作。