插入房间后的行

Posted

技术标签:

【中文标题】插入房间后的行【英文标题】:Rowid after Insert in Room 【发布时间】:2018-05-22 23:10:55 【问题描述】:

当主键是自动生成的字段时,我不确定使用 android 房间持久性库插入返回的值。

假设你有一个这样的房间实体:

@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】:

正如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 是您的主键的别名。是的,您可以将其存储起来以备将来使用。

【讨论】:

以上是关于插入房间后的行的主要内容,如果未能解决你的问题,请参考以下文章

插入后的NSMutableDictionary重新排序元素[重复]

vim学习笔记INSERT与定位

vim命令大全

mysql xdevapi nodejs:返回插入的行auto_increment id

在房间数据库中插入值

创建触发器后的 SQL Server