Room 中插入数据后的 Rowid

16

当使用Room Persistence Library for Android进行插入操作时,如果主键是自动生成的字段,我对其返回值不确定。

例如,假设您有一个Room实体类如下:

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

    public String text;
}

并且有一个像这样的Dao接口:

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

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

我创建了一个Message实例,然后将其持久化,如下所示:

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

insert()返回的rowid值是否总是等于Room分配给主键字段"id"的值,还是它们可能不同?

换句话说,"id"字段是否是底层SQLite表中rowid列的别名?

如果它们是别名,我可以将rowid值存储在我的"id"字段中,以备将来使用(例如用于更新),就像这样:

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

如果它们不是别名,我该如何做到呢?
1个回答

19

文档中所述(不幸的是不在@Insert文档中):

如果@Insert方法只接收1个参数,它可以返回一个长整型,该长整型是插入项的新rowId。如果参数是数组或集合,则应返回long []或List。

要了解什么是rowId,请访问此链接:https://www.sqlite.org/rowidtable.html

行ID表的主键(如果有)通常不是表的真正主键,因为它不是底层B树存储引擎使用的唯一键。这个规则的例外是当行ID表声明INTEGER PRIMARY KEY时。在例外情况下,INTEGER PRIMARY KEY成为rowid的别名。

所以...是的。在您的情况下,rowId是您主键的别名。并且,是的,您可以将其存储供将来使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接