2017-08-11 3 views
0

l'Entité se compose d'un seul ID d'article, qui est la clé primaire, je stocke dans DB par exemple 3 articles, quand la liste est mise à jour, avec 3 nouveaux articles dont j'ai besoin pour remplacer la liste existante. mais dans mon cas, il ajoute de nouvelles, mais je dois remplacer totalement ceux qui existent déjàComment remplacer la liste d'éléments par une nouvelle liste dans la persistance de pièce?

@Dao 
public interface UserIdDao { 
@Query("SELECT * FROM userIds") 
Flowable<List<UserId>> allUserIds(); 

@Insert(onConflict = OnConflictStrategy.REPLACE) 
List<Long> update(List<UserId> ids); 
} 

@Entity 
public class UserId{ 
    @PrimaryKey 
    private Long id; 

@Override 
public boolean equals(Object o) { 
if (this == o) return true; 
if (o == null || getClass() != o.getClass()) return false; 

UserId userId = (UserFavoriteStore) o; 

return (!id.equals(userId.id)); 
} 
@Override 


public int hashCode() { 
int result = id.hashCode(); 
result = 31 * result + (id.hashCode()); 
return result; 
}} 
+0

« lorsque la liste est mise à jour "- quelle liste? – CommonsWare

+0

Liste mise à jour (Liste ids); Je veux dire Liste de UserId –

Répondre

1

Je dois remplacer la liste existante par une nouvelle. mais dans mon cas, il en ajoute de nouveaux, mais j'ai besoin de remplacer totalement ceux existants

Vous avez écrit du code pour récupérer des ID et insérer des ID. Vous n'avez aucun code pour supprimer les ID. Donc, ajoutez une méthode @Delete à votre DAO pour supprimer les ID dont vous n'avez plus besoin. Ensuite, lorsque vous souhaitez remplacer les ID, supprimez ceux dont vous n'avez plus besoin avec votre méthode @Delete et @Insert ceux que vous souhaitez utiliser à la place.

OnConflictStrategy.REPLACE dit « si vous essayez d'insérer une ligne correspondant à une ligne existante par leurs clés primaires, ne pas tomber en panne, mais remplacer les autres colonnes de cette ligne existante supprimer les lignes incriminées avant d'insérer les nouveaux » (Voir the SQLite docs). Dans votre cas:

  • Vous avez pas d'autres colonnes
  • Insertion d'une nouvelle ID ne correspondra pas à ID existants par leurs clés primaires, vos données sont complètement une clé primaire
+0

Ok, si j'ajoute le nom de la colonne (String) qui pourrait être unique, mais ce n'est pas primaryKey car c'est String, pourrait-il être fait sans suppression, seulement avec la méthode insert? –

+0

@ A.A.I.A: D'abord, une clé primaire peut être une chaîne. Deuxièmement, je ne pense pas que Room supporte les contraintes 'UNIQUE' pour le moment, seulement des indices uniques, et je ne sais pas comment la stratégie' REPLACE' de SQLite gère ce scénario. – CommonsWare

+0

encore une question Si j'ai 2 fragments dans le premier j'appelle allUserIds() et dans la seconde j'appelle update/delete, si je reviens au premier fragment il devrait être mis à jour parce que le type de retour est fluide et j'ai rx. abonnements, oui? –