2018.03.30、Android-ObjectBox-查詢

Traning發表於2018-03-31

基本查詢操作

一、基本查詢操作

ObjectBox 查詢結果返回符合使用者定義條件的持久化物件,您可以使用QueryBuilder類來指定條件並建立查詢物件。Query類將實際執行查詢並返回匹配的物件

QueryBuilder:

你可以使用 QueryBuilder自定義查詢實體,搭配自動生成的屬性類一起使用。
下面是一個例子:實體類User和自動生成的屬性類User_

單條件查詢: 從所有使用者中查詢First name 是Joe的資料:

List<User> joes = userBox.query().equal(User_.firstName, "Joe").build().find();
複製程式碼

多條件查詢:從所有使用者中查詢First name 是Joe、1970年以後出生、並且LastName 是O開頭的資料:

QueryBuilder<User> builder = userBox.query();
builder.equal(User_.firstName, "Joe")
        .greater(User_.yearOfBirth, 1970)
        .startsWith(User_.lastName, "O");
List<User> youngJoes = builder.build().find();
複製程式碼

相關 QureyBuilder 查詢語句請參考:QureyBuilder

Query:

Query是QueryBuilder.build()得到

Query<User> query = builder.build();
複製程式碼

查詢物件:

這裡有幾個查詢方法來檢索匹配查詢的物件:

// return all entities matching the query
List<User> joes = query.find();

// return only the first result or null if none
User joe = query.findFirst();

// return the only result or null if none, throw if more than one result
User joe = query.findUnique();
複製程式碼

要返回匹配查詢的所有實體,只需呼叫 find()。

要僅返回第一個結果,請使用 findFirst()。

如果你希望得到一個唯一的結果呼叫 findUnique()來代替。如果查詢結果唯一,則返回該物件,如果查詢結果不唯一,會丟擲異常,如果沒有查詢結果則返回null。

重用query 和引數

查詢物件允許您以有效的方式多次執行查詢。為了使查詢更加可重用,您以前在QueryBuilder中設定的所有條件值都可以更改。這就是我們稱之為查詢引數的原因。

我們來看一個例子:

Query<User> query = userBox.query().equal(User_.firstName, "").build();
List<User> joes = query.setParameter(User_.firstName, "Joe").find();
List<User> jakes = query.setParameter(User_.firstName, "Jake").find();
複製程式碼

這裡我們使用了同一個查詢物件來查詢兩組使用者,每個使用者的名字都不同。請注意, 構建查詢時,我們仍然需要初始化firstName屬性的值 。因為我們使用setParameter ()覆蓋值。我們可以在初始構建查詢時傳遞一個空字串。

重用query的好處是不用每次通過build來獲取,頻繁查詢會提高效能。

限制、偏移和分頁(Limit, Offset, and Pagination)

有時您只需要查詢結果一個子集,例如在您的使用者介面中顯示的前10個元素。

當資料庫中有大量資料時,這是非常有用的。你不能僅僅使用查詢條件來限制結果,還可以使用Limit,
用offset和limit引數查詢(long offset ,long limit )方法:

Query<User> query = userBox.query().equal(UserProperties.FirstName, "Joe").build();
List<User> joes = query.find(/* offset by */ 10, /* limit to */ 5 /* results */);
複製程式碼

offset :第一個 偏移量結果被跳過。 limit :返回此查詢的數量。

懶載入結果(Lazy loading results)

為了避免立即載入查詢結果,Query提供了 findLazy() 和 findLazyCached() ,它們返回 查詢結果的LazyList。

LazyList是一個執行緒安全的,不可修改的列表,只有在訪問資料後才會懶惰地讀取資料。根據呼叫的查詢方法不同可以選擇是否快取。快取的懶惰列表儲存先前訪問的物件,以避免多次載入實體。列表的某些功能僅限於快取列表(例如需要整個列表的功能)。請參閱LazyList 文件以獲取更多詳細資訊。

關係(Relations)直接載入

預設情況下,關係會被懶載入,當你第一次訪問它時,它將執行一個資料庫查詢來獲取資料(以後的訪問將得到一個快取值-subsequent accesses will get a cached values without-)雖然這種查詢是ObjectBox的快速操作,但有些情況下我們不希望物件關係懶載入。 所以ObjectBox還允許您直接載入關係,以避免出現一些問題。你可以使用QueryBuilder.eager()方法來直接載入。

最後

有時你不想從查詢中返回物件,而是得到一個屬性的聚合值。ObjectBox支援以下方法(每個都以屬性作為引數): min / minDouble:查詢最小值。 max / maxDouble:查詢最大值。 sum / sumDouble:計算所有值的總和。( ? Note: the non-double version detects overflows and throws an exception in that case.) avg : 計算所有值的平均值(double型別)。

另外,可以直接通過呼叫count()來獲得結果的數量。

刪除物件

要刪除所有匹配查詢的物件,請呼叫 query.remove() 。

相關文章