Android Room 动态表名获取数据

8

是否可以通过将表名称作为参数来获取数据? 就像这样。

@Query("SELECT id, name from :tableName")
fun getData(tableName: String): List<RandomModel>

为什么你要使用具有相同结构(相同类型和列数)的多个表呢?相反,应该使用一个带有额外字段的表来标识你的行子集。 - pskink
3
代表不同的商业模式,它们之间具有不同的属性。我只想获取共同的属性。 - Sujin Shrestha
@pskink 这是非常普遍的,例如看看CRM软件(例如Salesforce) - 几乎每个记录都有一个iD和一个“名称”的表示。 - zaitsman
3个回答

4

试试这个

@Dao
interface RawDao {
 @RawQuery
 List<RandomModel> getData(SupportSQLiteQuery query);
}

 SimpleSQLiteQuery query = new SimpleSQLiteQuery("SELECT * FROM "+ tablename);
 List<RandomModel> models = rawDao.getUserViaQuery(query);

1
我认为Room不支持动态tableName
我们有两种方法:
1-在DAO中,我们可以将tableName替换为模型@Entity上定义的实际表名。
2-我们可以像这样使用@RawQuery:
@Dao
 interface RawDao {
     @RawQuery
     User getUserViaQuery(SupportSQLiteQuery query);
 }
 SimpleSQLiteQuery query = new SimpleSQLiteQuery("SELECT * FROM User WHERE id = ? LIMIT 1",
         new Object[]{userId});
 User user2 = rawDao.getUserViaQuery(query);

您可以在此处学习更多: this


0

首先在您的Dao中创建一个@RawQuery。只需使用您感兴趣的要监视的表/类,例如Class1、Class2等。

@RawQuery(  observedEntities = [Class1::class, CLass2::class]  )
fun query(query:SupportSqliteQuery): List<RandomModel>

只需使用必要的输入参数创建一个SimpleSqliteQuery即可。

请注意,Dao中使用的“SupportSqlite…”与doQuery()函数中使用的“SimpleSqlite…”之间存在差异。

fun doQuery(tableName:String):List<RandomModel> {

    //note $ sign in front of tableName instead of : sign
    val simpleSqliteQuery =  SimpleSqliteQuery("SELECT id, name from $tableName") 
    return dao().query( simpleSqliteQuery  )
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接