插入室内后的Rowid

时间:2017-12-08 16:57:37

标签: android-room

当主键是自动生成的字段时,我不确定使用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 个答案:

答案 0 :(得分:8)

正如文件所说:

  

如果@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是您的主键的别名。是的,你可以存储它以备将来使用。