【问题标题】:Room database INNER JOIN results房间数据库 INNER JOIN 结果
【发布时间】:2019-06-29 13:55:00
【问题描述】:

我有两张表是一对一的关系

例如:

表格:

  • 用户 [u_id,u_name,u_address]
  • 地址 [ add_id,add_country,add_town,add_street ]​​i>

这意味着我的 java 代码中有两个实体和两个 DAO

当我想执行这个查询时:select * from users inner join address on u_address = add_id

它会返回

LiveData<List<ItemUser>>

这样我会得到 u_address,它只是一个 ID 而不是 ItemAddress 对象,我可以在其中获取我想要的数据。

我知道我可以执行另一种方法来获取所选地址的数据,但我想知道是否可以通过仅调用一种方法来获取全部数据?

【问题讨论】:

    标签: android inner-join android-room


    【解决方案1】:

    我有 2 个相似的表

    1. 地址

    1.人员表

    @Entity(tableName = "person_table")
    data class Person(
        @PrimaryKey
        var id:Int? = 0,
        var name:String? = "",
        @ColumnInfo(name = "email")
        var email:String? = ""    //EMAIL
    )
    

    2。地址表

        @Entity(
        foreignKeys = [ForeignKey(
            entity = Person::class,
            parentColumns = arrayOf("id"),
            childColumns = arrayOf("personId"),
            onDelete = CASCADE
        )],
        tableName = "address_table"
    
    )
    data class Address(
        @PrimaryKey
        var id:Int? = 0,
        var name:String? = "" ,
        @ColumnInfo(name = "phoneNumber")
        var phoneNo:String? = "" ,    //PHONE NO
        var personId:Int? = 0
    )
    

    我想写一个inner join query来获得personemail电话号码的地址表格

    所以我做了一个新表

    data class PersonAddress(
        @ColumnInfo(name = "PhNumber") var phoneNo: String? = "" ,
        @ColumnInfo(name = "Email") var email: String? = ""
    )
    

    并在 DAO 中编写此查询

    @Dao
    interface AddressDAO {
    
        @Query("SELECT address_table.phoneNumber as PhNumber, person_table.email as"  
               + "Email FROM address_table" +
               "INNER JOIN person_table ON person_table.id = address_table.personId" 
               + "WHERE person_table.id =:personId")
        fun findAddressesForPerson(personId: Int): LiveData<List<PersonAddress>>
    
    }
    

    我成功地得到了结果:)

    【讨论】:

      【解决方案2】:

      据我了解,您想要这两个实体之间关系的结果。

      您可以使用Relation Annotation

      堆栈溢出中相同的answer

      在你的例子中会是这样的。

      @Entity
      public class Users {
       @PrimaryKey public final int u_id;
                   public final String u_name;
                   public final int u_address;
      }
      
      @Entity
      public class Address {
      @PrimaryKey public final int add_id;
                  public final String add_country;
                  public final String add_town;
                  public final String add_street;
      }
      
      public class UserAndAddress{
      @Embedded public Users user;
      
      @Relation(parentColumn = "u_id",
                entityColumn = "add_id") public List<Address> addressList;
      }
      

      @Dao
      public interface UserAndAddressDao {
      
      @Query("SELECT * from users")
      public List<UserAndAddress> getUsersAndAddress();
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      相关资源
      最近更新 更多