2017-06-05 70 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. 

     } 
    }); 
相關問題