Java >> Programma Java >  >> Java

Relazioni tra i tavoli delle stanze Android

Sto sviluppando un'app di chat. Ho due Entità

@Entity(tableName = "messages")
public class MessageItem {
    @PrimaryKey
    private Integer msgId;
    @ColumnInfo(name = "from_id")
    private String  contact_id; 
}

E

@Entity(tableName = "contact")
public class Contact{
    @PrimaryKey
    private Integer id;
    @ColumnInfo(name = "contact_phone")
    private String  phone; 
}

In MessageDao voglio che il telefono di contatto corrisponda al contact_id in MessageItem

Risposta

Hai tre modi per farlo.

1) Puoi utilizzare un POJO con un @Embedded e un @Relation, nel qual caso restituisci MessageItem con il contatto, ad es. :-

public class MessageItemWithContact {

    @Embedded
    MessageItem messageItem;
    @Relation(entity = Contact.class, parentColumn = "from_id", entityColumn = "id")
    Contact contact;
}

insieme a una @Query come :-

@Transaction
@Query("SELECT * FROM messages WHERE msgId=:msgId")
MessageItemWithContact getMessageByIdWithContact(int msgId);

2) Oppure puoi utilizzare un POJO con un @Embedded e una variabile aggiuntiva per il telefono utilizzando un JOIN ad es. :-

public class MessageItemWithPhone {
    @Embedded
    MessageItem messageItem;
    String phone;
}

Insieme a una @Query come :-

@Query("SELECT msgId, contact_phone, from_id FROM messages JOIN contact On from_id = id  ")
List<MessageItemWithPhone> getMessItemWithContactPhone();
  • non ha bisogno di @Transaction in quanto la query è una singola transazione (mentre il metodo precedente Room ottiene il MessageItem e quindi crea una query per ottenere gli oggetti correlati).
  • questa query ottiene tutti i MessageItems (poiché non è stata inclusa alcuna clausola WHERE)

3) Basta ottenere il telefono utilizzando from_Id per il relativo MessageItem senza la necessità di un POJO avendo una @Query come:-

@Query("SELECT contact_phone FROM contact WHERE id=:from_Id")
String getPhoneById(String from_Id);

Etichetta Java