Android Room一对一关系(获取外键字段)

3

我希望将Android ROOM应用到我的项目中。 但是我无法解决一个订单(customer_id)和客户(id)之间的一对一关系。

在OrderDao接口中,是否可能填充@Ignore protected Customer customer字段?

我只能解决Java代码。还有其他方法吗?

//    Customer.java 
@Entity (tableName = "t_customer")
public class Customer {
  @PrimaryKey(autoGenerate = true)
  @ColumnInfo(name = "id")
  protected String mId;

  @ColumnInfo(name = "name")
  protected String mName;

}

// Order.java
@Entity(tableName = "t_order",
    foreignKeys = {
    @ForeignKey(entity = Customer.class,
        parentColumns = "id",
        childColumns = "customer_id",
        onDelete = SET_NULL) }
public class Order {
  @PrimaryKey(autoGenerate = true)
  @ColumnInfo(name = "id")
  protected String mId;

  @ColumnInfo(name = "description")
  protected String mDescription;

  @ColumnInfo(name = "customer_id")
  protected String mCustomerId;

  @Ignore
  **protected Customer customer;**

//....  
}

//OrderDao.java

@Dao
public interface OrderDao {

  @Query("SELECT * from t_order ORDER BY id DESC")
  LiveData<List<Order>> listByIds();

  @Query("SELECT * from t_order WHERE id = :id LIMIT 1")
  LiveData<Order> readById(long id);

//....
}
1个回答

3

目前还没有自动填写Customer的方法。您需要创建另一个名为OrderWithCustomer的POJO,它可能如下所示:

public class OrderWithCustomer {

    @Embedded
    private Order order;

    @ColumnInfo(name = "name")
    private String customerName;
}

在你的DAO中:
@Dao
interface OrderDao {

    @Query("SELECT t_order.* name FROM t_order LEFT JOIN t_customer ON t_order.customer_id = t_customer.id")
    public List<OrderWithCustomer> getOrderWithCustomer();

}

2
谢谢您的回复。我原本期望像GreenDAO中的@ToOne注释一样的1-1关系。希望Google能够添加这个注释。 - chrome
2
我也希望如此。Room 中的关系确实很棘手。 - Akshay Chordiya
你能否使用这种方法选择两个表中的所有列(只要它们的名称不重复)? - TheRealChx101
@TheRealChx101 是的,你可以。 - Akshay Chordiya
1
谢谢。我在使用Room时遇到了困难,所以最终选择放弃它,转而使用ObjectBox。在我看来,ObjectBox比Room更好。它支持Rx和Android的分页库。真是太棒了。 - TheRealChx101

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