J'utilise la bibliothèque de persistance de salle Android pour mon nouveau projet. Je veux mettre à jour un champ de table. J'ai essayé comme dans mon Dao
-
// Method 1:
@Dao
public interface TourDao {
@Update
int updateTour(Tour tour);
}
Mais lorsque j'essaie de mettre à jour à l'aide de cette méthode, il met à jour chaque champ de l'entité où il correspond à la valeur de clé primaire de l'objet de tournée. j'ai utilisé@Query
// Method 2:
@Query("UPDATE Tour SET endAddress = :end_address WHERE id = :tid")
int updateTour(long tid, String end_address);
Cela fonctionne mais il y aura de nombreuses requêtes dans mon cas car j'ai de nombreux champs dans mon entité. Je veux savoir comment puis-je mettre à jour certains champs (pas tous) comme Method 1
where id = 1; (id est la clé primaire de génération automatique).
// Entity:
@Entity
public class Tour {
@PrimaryKey(autoGenerate = true)
public long id;
private String startAddress;
private String endAddress;
//constructor, getter and setter
}
Réponses:
Utilisez
@Query
, comme vous l'avez fait dans la méthode 2.Ensuite, ayez des entités plus petites. Ou, ne mettez pas à jour les champs individuellement, mais ayez plutôt des interactions plus grossières avec la base de données.
IOW, il n'y a rien dans la salle elle-même qui fera ce que vous cherchez.
la source
@Query
.true =1
,false=0
SELECT * FROM note_table WHERE isNoteArchived == 0
Selon la documentation de mise à jour SQLite :
Exemple:
Entité:
Dao:
la source
À partir de la salle 2.2.0 publiée en octobre 2019, vous pouvez spécifier une entité cible pour les mises à jour. Ensuite, si le paramètre de mise à jour est différent, Room ne mettra à jour que les colonnes d'entité partielle. Un exemple pour la question OP le montrera un peu plus clairement.
Notez que vous devez créer une nouvelle entité partielle appelée TourUpdate, avec votre véritable entité Tour dans la question. Désormais, lorsque vous appelez update avec un objet TourUpdate, il met à jour endAddress et laisse la valeur startAddress identique. Cela fonctionne parfaitement pour moi pour mon cas d'utilisation d'une méthode insertOrUpdate dans mon DAO qui met à jour la base de données avec de nouvelles valeurs distantes de l'API mais laisse les données de l'application locale dans la table seules.
la source
Vous pouvez essayer ceci, mais les performances peuvent être un peu moins bonnes:
la source
Je pense que vous n'avez pas besoin de mettre à jour uniquement un champ spécifique. Mettez simplement à jour toutes les données.
Il s'agit essentiellement d'une requête donnée. Pas besoin de faire une nouvelle requête.
Memo.class
La seule chose que vous devez savoir est «id». Par exemple, si vous souhaitez mettre à jour uniquement le «titre», vous pouvez réutiliser le «contenu» et la «photo» à partir de données déjà insérées. Dans du vrai code, utilisez comme ça
la source
Si vous devez mettre à jour les informations utilisateur pour un ID utilisateur spécifique «x»,
Le ViewModel initialisera une instance de dbManager pour accéder à la base de données. Le code devrait ressembler à ceci:
Ensuite, mettez simplement à jour votre élément utilisateur de cette façon, supposons que votre userId soit 1122 et que userName soit "xyz" qui doit être changé en "zyx".
Obtenir un objet userItem de l'id 1122 User object
Ceci est un code brut, j'espère qu'il vous aidera.
Bon codage
la source