【问题标题】:Android Room Fetch data with dynamic table name具有动态表名的 Android Room Fetch 数据
【发布时间】:2020-01-16 07:13:30
【问题描述】:

是否可以通过将table name 作为parameter 传递给fetch data?像这样。

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

【问题讨论】:

  • 为什么要使用具有相同结构(相同类型和列数)的多个表?而是使用一个带有额外字段的表来标识您的行子集
  • 代表不同的商业模式,各有不同的属性。我只想获取通用属性。
  • @pskink 这很常见,例如看看 CRM 软件(例如 Salesforce)——几乎每条记录都有一个 iD 和一个“名称”的表示。

标签: android database kotlin android-room


【解决方案1】:

试试这个

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

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

【讨论】:

    【解决方案2】:

    我认为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

    了解更多信息

    【讨论】:

      【解决方案3】:

      你首先在你的 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  )
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-27
        • 1970-01-01
        • 2015-03-24
        • 1970-01-01
        相关资源
        最近更新 更多