Realm遇上Kotlin

831804-20170216224841207-2015883983.jpg
相信用過Android Realm資料庫的同學享受了Realm的強大的同時,也忍受了Realm事物操作的繁瑣。例如 Realm有很多限制,讓它操作起來變得非常複雜。
如需要人為開啟和關閉Realm例項,且要在同一個執行緒中執行。
另一個限制是,你沒有先從Realm解開不同執行緒之間的連結,那麼你就不能在它們之間傳遞你的查詢結果。即使你要執行的是單一操作,你還必須注意事務管理。
有些很煩人的限制例子,你必須意識到它們在未來避免這些問題。
下面給大家介紹的值款Realm API轉換成了我們大家喜歡的樣子,忽略了眾多的Realm限制,使其工作在更大哦的抽象層
這個庫的名稱是Kotlin Realm Extensions(Kotlin Realm擴充套件), ofollow,noindex">你可以在這裡找到 。
其次,你應該知道這個庫能為你做什麼:
獲得預設的Realm例項,在事務完成後關閉它。
啟動和提交事務。
在其它執行緒中,為使Realm物件之間工作,斷開它們的連結。
在主執行緒中執行可觀察的查詢(Realm要求這類查詢)
最後,我們必須做下列工作。看看一些例子:
以Java持久化實體
Realm realm = Realm.getDefaultInstance(); try{ realm.executeTransaction(realm -> { realm.copyToRealmOrUpdate(user); }); } finally { realm.close(); } User user = new User("John"); Realm realm = Realm.getDefaultInstance(); try{ realm.executeTransaction(realm -> { realm.copyToRealmOrUpdate(user); }); } finally { realm.close(); }
等效的Kotlin Realm擴充套件
User("John").save()
我們還可以有saveAll()方法用於陣列和集合。
Java
Realm realm = Realm.getDefaultInstance(); try { realm.executeTransaction(realm -> { realm.copyToRealmOrUpdate(users); }); } finally { realm.close(); }
Kotlin
listOf<User>(...).saveAll()
以Java查詢所有給定型別的實體
Realm realm = Realm.getDefaultInstance(); try { Event firstEvent = realm.where(Event.class).findFirst(); firstEvent = realm.copyFromRealm(event); } finally { realm.close(); }
等效的Kotlin Realm擴充套件
val firstEvent = Event().queryFirst() //Or val first = queryFirst<Event>
我們也能以簡單的方法執行條件查詢:
Java
Realm realm = Realm.getDefaultInstance(); try{ List<Event> events = realm.where(Event.class).equalTo("id",1).findAll(); events = realm.copyFromRealm(event); } finally { realm.close(); }
Kotlin
val events = Event().query { equalTo("id",1) } //Or query<Event> { ... } //NOTE: If you have a compilation problems in equalTo method (overload ambiguity error), you can use equalToValue("id",1) instead
如果您只需要第一個或最後一個結果,您還可以使用:
val first = Event().queryFirst { equalTo("id",1) } val last = Event().queryLast { equalTo("id",1) }
獲取排序的實體
val sortedEvents = Event().querySorted("name",Sort.DESCENDING) val sortedEvents = Event().querySorted("name",Sort.DESCENDING) { equalTo("id",1) }
刪除實體
Java
Realm realm = Realm.getDefaultInstance(); try{ List<Event> events = realm.where(Event.class).findAll(); realm.executeTransaction(realm -> {``` events.deleteAllFromRealm(); }); } finally { realm.close(); }
Kotlin
Event().deleteAll() //Or deleteAll<Event>
按條件刪除
Java
Realm realm = Realm.getDefaultInstance(); try{ List<Event> events = realm.where(Event.class).equalTo("id",1).findAll().deleteAllFromRealm(); events = realm.copyFromRealm(event); } finally { realm.close(); }
Kotlin
Event().delete { equalTo("id", 1) }
監聽資料變更
Java
Realm realm = Realm.getDefaultInstance(); Flowable<List<Event>> obs =realm.where(Event.class).findAllAsync() .asFlowable() .filter(RealmResults::isLoaded) .map(realm::copyFromRealm) .doOnUnsubscribe(() -> realm.close());
Kotlin
val obs = Event().queryAllAsFlowable() //Or queryAllAsFlowable<Event>