2017-07-18 4 views
1

Je suis nouveau sur Room, et @Relation n'est pas clair pour moi. Si je comprends bien, j'ai des entités par ex. (RSS) ChannelEntity, et le canal a des éléments nommés ItemEntity. Ce sont des classes avec l'annotation @Entity. J'ai aussi un POJO pour "connecter" mes entités. Je veux dire que j'ai à écrire un POJO comme ceci:Bibliothèque Android Persistance Room

public class Channel { 

    @Embedded 
    private ChannelEntity channel; 

// Link is the primary key in ChannelyEntity 
    @Relation (parentColumn = "link", entityColumn = "channel_link") 
    private ArrayList<ItemEntity> items; 

// Getters and Setters are here 
} 

que je n'ai d'écrire une interface dao où je peux obtenir Channel (pas ChannelEntity) comme ceci:

public interface ChannelDao { 

    @Query("SELECT * FROM channels WHERE link = :link LIMIT 1") 
    Channel getChannelById(String link); 

    @Query("SELECT * FROM channels") 
    ArrayList<Channel> getAllChannels(); 
} 

Avec ces entités , DAOs et POJOs Je peux obtenir des objets Channel qui contiennent une liste d'items avec le lien correspondant (id). Est-ce correct?

Mon autre question concerne le reste. Par exemple. si je souhaite enregistrer une nouvelle chaîne, puis-je ajouter cette déclaration à mon ChannelDao?

@Insert(onConflict = OnConflictStrategy.REPLACE) 
void createChannels(Channel... channels); 

supprimer

@Delete 
void deleteChannels(Channel... channels); 

et ainsi de suite. Alors, va-t-il créer et supprimer les ChannelEntities et ItemEntities de l'objet Channel transmis?

+0

Demandez-vous ou avez-vous essayé et cela ne fonctionne pas? Room Persistence Library est nouveau (et alpha) donc pas beaucoup d'utilisateurs Android expérimentés ont eu le temps de jouer avec elle (étant donné qu'il est peu probable d'être utilisé dans la production * *), il est donc préférable de trouver des erreurs concrètes, des échantillons en général; on dirait que vous essayez juste d'obtenir la validation, mais personne n'aura le temps de tester cela. Alors allez-y, essayez-le et signalez les erreurs quand elles se produisent. Et affichez tous vos cours pertinents, ni seulement la moitié d'entre eux. –

+0

"Puis-je ajouter cette instruction à mon ChannelDao?" - AFAIK, non. L'idée derrière '@ Relation', aussi proche que je puisse dire, est de l'utiliser pour remplir un modèle de vue. – CommonsWare

+0

Je ne l'ai pas encore utilisé, au début je voudrais savoir comment je peux persister et le lire à partir de DB avec des objets de la salle qui contient la liste ou d'autres objets. Si j'utilise @ForeignKey, je peux récupérer l'objet avec la liste dans une requête. – user3057944

Répondre

1

J'ai mis à jour mes classes comme @CommonsWare l'a conseillé. Maintenant, j'ai classes d'entités avec un objet @Embedded:

@Entity (tableName = "channels") 
public class ChannelEntity { 
    // Required channel elements 
    // The name of the channel. It's how people refer to your service. 
    private String title; 
    // The URL of the HTML website corresponding to the channel 
    @PrimaryKey 
    private String link; 
    //other fileds 
    @Embedded 
    private TextInputEntity textInputEntity; 
    @Embedded 
    private ImageEntity imageEntity; 
    //getters and setters 
} 

Une des classes intégrées:

// Specifies a text input box displayed with the channel. 
// Embedded in ChannelEntity 
public class TextInputEntity { 
    // Required elements 
    // The label of the Submit button in the text input area. 
    private String title; 
    // Explains the text input aera. 
    private String description; 
    // The name of the text object int hte text input area. 
    private String name; 
    // The URL of the CGI script that processes the text input request 
    private String link; 
    @ColumnInfo (name = "channel_link") 
    private String channelLink; 
} 

Je l'ai écrit pour toutes les classes daos ont annotation @Entity (I ENTITE classes EMBEDDED même ils ne le sont pas, mais j'aurais des classes modèles pour les vues et je ne veux pas les mélanger plus tard).

Je cartographié les relations comme celle-ci:

// All items are optional, but at least one of title or description must be presented. 
@Entity (tableName = "items" 
     , foreignKeys = @ForeignKey (entity = Channel.class 
     , parentColumns = "link" 
     , childColumns = "channel_link")) 
public class ItemEntity { 
    @PrimaryKey (autoGenerate = true) 
    private int id; 
    // Title of the item 
    private String title; 
    // Other fileds 
    @ColumnInfo (name = "channel_link") 
    private String channelLink; 
    // Getters and setters 

Et quand je veux un canal avec la liste des articles que je l'obtenir comme ceci:

public class Channel { 
    @Embedded 
    private ChannelEntity channel; 
    @Relation (parentColumn = "link", entityColumn = "channel_link") 
    private ArrayList<ItemEntity> items; 
    @Relation (parentColumn = "link", entityColumn = "channel_link") 
    private ArrayList<SkipDayEntity> skipDays; 
    @Relation (parentColumn = "link", entityColumn = "channel_link") 
    private ArrayList<SkipHourEntity> skipHours; 
//Setters and getters 
} 

Et c'est le dao pour le canal :

@Dao 
public interface ChannelDao { 
    @Insert (onConflict = OnConflictStrategy.REPLACE) 
    void insertChannel(ChannelEntity channel); 

    @Update 
    void updateChannel(ChannelEntity channel); 

    @Delete 
    void deleteChannel(ChannelEntity channel); 

    @Query ("SELECT * FROM channles WHERE link = :link LIMIT 1") 
    Channel getChannelByLink(String link); 

    @Query ("SELECT * FROM channels") 
    LiveData<ArrayList<Channel>> getAllChannels(); 
}