当主键是自动生成的字段时,我不确定使用Room Persistence Library for Android的插入返回的值.
假设您有这样的房间实体:
@Entity()
public class Message {
@PrimaryKey(autoGenerate = true)
public long id;
public String text;
}
Run Code Online (Sandbox Code Playgroud)
和像这样的Dao界面:
@Dao
public interface MessageDao {
@Insert
long insert(Message messages);
@Update
void update(Message... messages);
}
Run Code Online (Sandbox Code Playgroud)
我创建一个Message实例,然后我坚持这样:
Message message = new Message();
message.text = "Hello!"
long rowId = AppDatabase.getInstance(context).messageDao().insert(message);
Run Code Online (Sandbox Code Playgroud)
insert()返回的rowid值是否始终等于Room分配给主键字段"id"的值,或者它们可以不同?
换句话说,"id"字段是否是底层SQLite表的rowid列的别名?
如果它们是别名,我可以将rowid值存储在我的"id"字段中,以备将来使用(例如更新),这样:
message.id = rowId;
message.text = "Goodbye!"
AppDatabase.getInstance(context).messageDao().update(message);
Run Code Online (Sandbox Code Playgroud)
如果它们不是别名,我该怎么做?
Ray*_*aga 10
正如文件所说:
如果@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是您的主键的别名.是的,你可以存储它以备将来使用.
| 归档时间: |
|
| 查看次数: |
5500 次 |
| 最近记录: |