做者:Víctor Manuel Pinedagit
时间:Feb 14, 2017github
原文连接:https://antonioleiva.com/kotlin-realm-extensions/数组
当有人问我,最喜欢Kotlin什么,我很难找出其突出特性。函数
数据类型、拉姆达(Lambda)表达式、类型推断、委托… 全部这些都担当起一系列完整的、有意义的提高,使其在这些方面不一样于其基础的Java。性能
固然,这些特性其中任何一个都是我使用最多的扩展。在全部个人Android项目中,我都利用Kotlin的扩展。gradle
我第一次听到这概念时感到很奇怪。无需继承就能够添加函数进入类,甚至不用访问,彷佛对我时无用的和没有必要的。ui
加入类的任何内容位置点是在个人范围中吗?个人第一印象不是很好。我认为这将致使一些坏习惯,且代码难于理解。url
然而,在我开始理解全部这些简单概念背后的强大能力,全部疑问很快就消失了。spa
用imageView.loadFrom(url)从url加载图像,简单地10.toPx(context)将dp单位转换到px单位,或用view.removeFromParent()方法从父视图中删除一个视图时,是很是有趣的。它们都是我须要的方法。线程
如今,我已经能够如同它们是Android SDK的一部分使用它们了。
全部这些促使我编写小型扩展库简化Realm的用法。
若是你已经试用(且忍受)Android的Realm,你就应该知道它包含一些通用操做的模板。另外,它有些限制使其变得复杂,如须要人为打开和关闭Realm实例,且要在同一个线程中执行。
另外一个限制是,你没有先从Realm解开不一样线程之间的连接,那么你就不能在它们之间传递你的查询结果。即便你要执行的是单一操做,你还必须注意事务管理。
有些很烦人的限制例子,你必须意识到它们在将来避免这些问题。
我编写这个库的目的是要将Realm API转换我所喜欢的那样。我要忽略全部Realm的限制,使其工做在更高的抽象层上。
这个库的名称是Kotlin Realm Extensions(Kotlin Realm扩展),你能够在这里找到。
它使用起来很是简单。首先,你必须包含如下依赖关系到你的build.gradle文件中:
1 compile 'com.github.vicpinm:krealmextensions:1.0.4'
其次,你应该知道这个库能为你作什么:
最后,咱们必须作下列工做。看看一些例子:
1 User user = new User("John"); 2 3 Realm realm = Realm.getDefaultInstance(); 4 try{ 5 realm.beginTransaction(); 6 realm.copyToRealmOrUpdate(user); 7 realm.commitTransaction(); 8 } finally { 9 realm.close(); 10 }
1 User("John").save()
咱们还能够有saveAll()方法用于数组和集合。
1 Realm realm = Realm.getDefaultInstance(); 2 try { 3 List events = realm.where(Event.class).findAll(); 4 events = realm.copyFromRealm(event); 5 } finally { 6 realm.close(); 7 }
1 val events = Event().allItems
咱们也能以简单的方法执行条件查询:
1 val events = Event().query { it.equalTo("id",1) }
Lambda表达式能够以参数形式接收RealmQuery实例,这样咱们就能够与咱们的条件执行查询。
咱们还能实时观察和监听数据变化执行咱们的查询。这在Realm中多是至关乏味的:
1 Realm realm = Realm.getDefaultInstance(); 2 Observable<List> obs = realm.where(Event.class).findAllAsync() 3 .asObservable() 4 .filter(RealmResults::isLoaded) 5 .map(realm::copyFromRealm) 6 .doOnUnsubscribe(() -> realm.close());
全部这些被简化的至关简单:
val obs = Event().allItemsAsObservable
或你要条件约束查询:
1 val obs = Event().queryAsObservable { it.equalTo("id",1) }
这是你可达到的高度抽象的小型例子。完整的文档在GitHub站点上提供。
如你所见,在某些环境下,扩展用法能最大限度地简化咱们代码。
随然,我仍认为应该谨慎使用扩展,应该避免滥用它们。可是,充分利用好这个特性可以提高咱们代码的可读性和可维护性,而且我认为这个库是一个好例子。
我鼓励你去试用它,留下你的意见。
Víctor Manuel Pineda是Kotlin Realm扩展库的开发者。他是DIGIO Soluciones Digitales 的Android和iOS开发工程师。