2015-04-24 21 views
8

Làm cách nào để hạn chế số lượng đối tượng mà Realm trả về? .findAll trả về tất cả các hàng khớp với truy vấn và .findFirst chỉ trả lại hàng đầu tiên. Nhưng những gì về một cái gì đó giống như 1000 đầu tiên? .findAll có thể trả về rất nhiều hàng mà nó tiêu thụ quá nhiều bộ nhớ.Giới hạn kết quả Realm

Trả lời

13

Điều thú vị là bạn không cần phải lo lắng về điều đó với Realm. Đối tượng kết quả được trả về từ một truy vấn đang tải các đối tượng và các trường của nó một cách lười biếng khi bạn truy cập chúng. Các đối tượng của bạn không bao giờ được sao chép và do đó chỉ được biểu diễn một lần trong bộ nhớ/đĩa.

Chi tiết triển khai (hiện tại) của điều này là đối tượng RealmResults trả về từ truy vấn chỉ là danh sách tham chiếu đến đối tượng phù hợp. Những tài liệu tham khảo là những con số nhỏ được lưu trữ nén để họ mất rất ít bộ nhớ. Vì vậy, ngay cả với 100.000 trận đấu nó thực sự sẽ không mất nhiều bộ nhớ. Và nó sẽ chiếm cùng một lượng bộ nhớ cho tất cả các loại đối tượng, cho dù chúng có một trường int hay hàng trăm trường có chuỗi hoặc nhị phân lớn.

0

Một cách có thể này, nếu bạn thực sự muốn chỉ RealmResults, sử dụng Streamlimit phương pháp:

//get all results of your choice query 
RealmResults<TypeClass> entities = realm.where(TypeClass.class).findAll(); 
//limit using Stream 
List<Integer> ids = Stream.of(entities).limit(10).map(x -> x.Id).collect(Collectors.toList()); 
//return only those ids elments 
return realm.where(TypeClass.class).in("Id", ids.toArray(new Integer[])).findAll(); 
+1

Đừng quên tính toán lại những điều này trong 'entity''s RealmChangeListener – EpicPandaForce

0

Realm hiện không cung cấp bất kỳ chức năng giới hạn nhưng nếu bạn muốn các yếu tố N đầu tiên

int N=10; // whatever value you want 
Realm mRealm=Realm.getDefaultInstance(); 

RealmResults<Example> list= mRealm.where(Example.class).findAll(); 
list.subList(0,N); 

cho các phần tử N cuối cùng

1

Tôi đã tìm ra giải pháp để đạt được điều này sau nhiều ngày sử dụng truy vấn "giữa" như được tìm thấy trong tài liệu chính thức https://realm.io/docs/java/latest

Nếu bạn muốn tìm nạp phần tử N đầu tiên, Chỉ cần chuyển số từ và đến với tên trường như dưới đây

realm.where(clazz).between("count",0,1000).findAll(); 

đâu,

"đếm" = Dòng tên (tức là tên biến trong POJO của bạn)
"0" = Dải Từ
"1000" = Phạm vi đến

Ví dụ: Truy vấn trên sẽ tìm nạp 0 đến 1000 đầu tiên dưới dạng RealmResults.

Lưu ý: Giải pháp trên chỉ hoạt động nếu bạn có một số id duy nhất có số lượng hàng. Trong trường hợp của tôi, tôi chèn giá trị đếm hàng theo cách thủ công trước khi chèn các giá trị vào trong Realm.

Các vấn đề liên quan