插入房间后的辫子形状

问题描述 投票:10回答:1

[当主键是自动生成的字段时,我不确定使用Android的Room Persistence库通过插入返回的值。

说您有一个这样的房间实体:

@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);

如果不是别名,我该怎么办?

android-room
1个回答
10
投票

[documentation(很遗憾,不在@Insert文档中)说:

如果@Insert方法仅接收1个参数,则可以返回long,这是插入项的新rowId。如果参数是数组或集合,应返回long []或List代替。

要了解什么rowId属于此链接:https://www.sqlite.org/rowidtable.html

rowid表的PRIMARY KEY(如果有)通常不是表的真正主键,因为它不是唯一的基础B树存储引擎使用的密钥。的例外该规则是在rowid表声明一个INTEGER PRIMARY KEY时。在例外,INTEGER PRIMARY KEY成为该rowid的别名。

所以...是的。您的情况下,rowid是主键的别名。是的,您可以将其存储以备将来使用。

© www.soinside.com 2019 - 2024. All rights reserved.