插入房间后的行
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重新排序元素[重复]