2017-06-05 14 views
21

Đây là cách tôi đang chèn dữ liệu vào cơ sở dữ liệu sử dụng Phòng Thư viện Persistence:Android phòng - Lấy id của hàng chèn mới với tính năng tự động tạo ra

Entity:

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

dữ liệu đối tượng truy cập:

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

Có thể trả lại id của người dùng sau khi quá trình chèn hoàn thành trong chính phương thức trên mà không cần phải viết truy vấn chọn riêng không?

+0

Các bạn đã thử sử dụng 'int' hoặc' long' thay của 'void' là kết quả của thao tác' @ Insert'? – MatPag

+0

Chưa. Tôi sẽ bắn! – Umarov

+0

Tôi cũng đã thêm một câu trả lời vì tôi đã tìm thấy tài liệu tham khảo trong tài liệu và tôi khá tự tin rằng nó sẽ hoạt động;) – MatPag

Trả lời

36

Dựa trên các tài liệu here (dưới đoạn mã)

Một phương pháp chú thích với các @Insert chú thích có thể trả lại:

  • long cho hoạt động chèn đơn
  • long[] hoặc Long[] hoặc List<Long> cho nhiều thao tác chèn
  • void nếu bạn không quan tâm đến các id chèn (s)
+0

tại sao trong tài liệu hiện nó nói int cho loại id nhưng trả về lâu? giả sử id sẽ không bao giờ đủ lớn để có thể tồn tại lâu? do đó, id hàng và id tạo tự động thực sự giống nhau? –

+0

Trong SQLite id khóa chính lớn nhất mà bạn có thể có là một số nguyên có dấu 64 bit, vì vậy giá trị tối đa là 9,223,372,036,854,775,807 (chỉ dương vì nó là id). Trong java một int là 32 bit ký số và là giá trị tích cực tối đa là 2.147.483.647, do đó, không thể đại diện cho tất cả các id. Bạn cần phải sử dụng một Java dài mà giá trị tối đa của nó là 9,223,372,036,854,775,807 để đại diện cho tất cả các id. Tài liệu này là ví dụ duy nhất, nhưng api được thiết kế với điều này trong tâm trí (đó là lý do tại sao nó trở lại dài và không int hoặc đôi) – MatPag

+0

ok vì vậy nó thực sự cần được một thời gian dài. nhưng có thể đối với hầu hết các trường hợp sẽ không có 9 tỷ hàng trong một db sqlite để chúng sử dụng int làm ví dụ cho userId vì nó mất ít bộ nhớ hơn (hoặc nó là một sai lầm). Đó là những gì tôi lấy từ điều này. Cảm ơn bạn đã giải thích về lý do tại sao nó trả về lâu dài. –

5

@Insert chức năng có thể trả lại void, long, long[] hoặc List<Long>. Hãy thử điều này.

@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

Giá trị trả về của chèn cho một bản ghi sẽ được 1 câu lệnh if bạn thành công.

Trong trường hợp bạn muốn chèn danh sách các đối tượng, bạn có thể đi với:

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

Và thực hiện nó với 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. 

     } 
    }); 
Các vấn đề liên quan