web-dev-qa-db-fra.com

Rowid après insertion dans la pièce

Je ne suis pas sûr de la valeur renvoyée par un insert à l'aide de la bibliothèque de persistance de pièce pour Android, lorsque la clé primaire est un champ généré automatiquement.

Supposons que vous ayez une entité de pièce comme celle-ci:

@Entity()
public class Message {
    @PrimaryKey(autoGenerate = true)
    public long id;

    public String text;
}

et une interface Dao comme celle-ci:

@Dao
public interface MessageDao {
    @Insert
    long insert(Message messages);

    @Update
    void update(Message... messages);
    }

Je crée une instance de Message, puis je la persiste comme ceci:

Message message = new Message();
message.text = "Hello!"
long rowId = AppDatabase.getInstance(context).messageDao().insert(message);

La valeur rowid renvoyée par insert () est-elle toujours égale à la valeur affectée par Room au champ de clé primaire "id", ou peut-elle différer?

En d'autres termes, le champ "id" est-il un alias pour la colonne rowid de la table SQLite sous-jacente ou non?

S'ils étaient des alias, je pourrais stocker la valeur rowid dans mon champ "id", pour une utilisation future (par exemple pour la mise à jour), de cette façon:

message.id = rowId;
message.text = "Goodbye!"
AppDatabase.getInstance(context).messageDao().update(message);

S'ils ne sont pas des alias, comment faire?

10
Cristiano

Comme le dit documentation (malheureusement pas dans la documentation @ Insert ):

Si la méthode @ Insert ne reçoit qu'un seul paramètre, elle peut renvoyer un long, qui est le nouveau rowId pour l'élément inséré . Si le paramètre est un tableau ou une collection, il doit renvoyer long [] ou List à la place.

Pour comprendre quel rowId est en jachère, ce lien: https://www.sqlite.org/rowidtable.html

La CLÉ PRIMAIRE d'une table rowid (s'il y en a une) n'est généralement pas la véritable clé primaire de la table, dans le sens où ce n'est pas la clé unique utilisée par le moteur de stockage d'arborescence B sous-jacent. L'exception à cette règle est lorsque la table rowid déclare une INTEGER PRIMARY KEY. Dans l'exception, la INTEGER PRIMARY KEY devient un alias pour le rowid.

Donc oui. rowid dans votre cas IS un alias de votre clé primaire. Et OUI vous pouvez le stocker pour une utilisation future.

11
Raymond Arteaga