2017-06-05 43 views
21

这是我如何使用客房持久性库将数据插入到数据库:Android的房间 - 获取新插入的行的ID与自动生成

实体:

@Entity 
class User { 
    @PrimaryKey(autoGenerate = true) 
    public int id; 
    //... 
} 

数据访问对象:

@Dao 
public interface UserDao{ 
    @Insert(onConflict = IGNORE) 
    void insertUser(User user); 
    //... 
} 

一旦插入完成在上面的方法本身而不写一个单独的选择查询,是否有可能返回用户的ID?

+0

您是否尝试过使用'int'或'代替long'作为'@ Insert'操作的结果'void'? – MatPag

+0

还没有。我会投篮! – Umarov

+0

我已经添加了一个答案,因为我找到了文档中的引用,并且我非常有信心它会起作用;) – MatPag

回答

36

基于文档here(下面的代码段)上

@Insert注解的方法可以返回:

  • long为单个插入操作
  • long[]Long[]List<Long>用于多次插入操作
  • void,如果你不关心插入ID(S)
+0

为什么在文档中它说ID为int类型的int,但返回很长?假设身份证永远不会足够长久?所以行ID和自动生成ID字面上是相同的东西? –

+0

在SQLite中,您可以拥有的最大主键ID是64位有符号整数,因此最大值为9,223,372,036,854,775,807(仅为正值,因为它是一个ID)。在java中,int是32位有符号数,最大正值是2,147,483,647,所以不能表示所有的id。您需要使用Java long,其最大值为9,223,372,036,854,775,807来表示所有ID。这个文档仅仅是一个例子,但是api的设计时考虑到了这一点(这就是为什么它返回的时间很长,而不是int或者double) – MatPag

+0

没问题,所以它确实应该很长。但是在大多数情况下,在sqlite数据库中不会有90亿行,所以他们使用int作为userId的一个例子,因为它占用较少的内存(或者它是一个错误)。这就是我从中获得的。感谢关于为什么它返回很长的解释。 –

5

@Insert函数可以返回void,long,long[]List<Long>。请试试这个。

@Insert(onConflict = OnConflictStrategy.REPLACE) 
    long insert(User user); 

// Insert multiple items 
@Insert(onConflict = OnConflictStrategy.REPLACE) 
    long[] insert(User... user); 
+1

'return Single.fromCallable(() - > dbService.YourDao()。insert(mObject) );' – murt

4

插入一条记录的返回值,如果你的语句成功为1。

如果要插入对象的列表,你可以去:

@Insert(onConflict = OnConflictStrategy.REPLACE) 
public long[] addAll(List<Object> list); 

并与Rx2的执行:

Observable.fromCallable(new Callable<Object>() { 
     @Override 
     public Object call() throws Exception { 
      return yourDao.addAll(list<Object>); 
     } 
    }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<Object>() { 
     @Override 
     public void accept(@NonNull Object o) throws Exception { 
      // the o will be Long[].size => numbers of inserted records. 

     } 
    }); 
相关问题