Kotlin将Realm提升到更高层次
作者:Víctor Manuel Pineda
时间:Feb 14, 2017
原文链接:https://antonioleiva.com/kotlin-realm-extensions/
当有人问我,最喜欢Kotlin什么,我很难找出其突出特性。
数据类型、拉姆达(Lambda)表达式、类型推断、委托… 所有这些都担当起一系列完整的、有意义的提升,使其在这些方面不同于其基础的Java。
探索Kotlin扩展
当然,这些特性其中任何一个都是我使用最多的扩展。在所有我的Android项目中,我都利用Kotlin的扩展。
我第一次听到这概念时感到很奇怪。无需继承就可以添加函数进入类,甚至不用访问,似乎对我时无用的和没有必要的。
加入类的任何内容位置点是在我的范围中吗?我的第一印象不是很好。我认为这将导致一些坏习惯,且代码难于理解。
然而,在我开始理解所有这些简单概念背后的强大能力,所有疑问很快就消失了。
用imageView.loadFrom(url)从url加载图像,简单地10.toPx(context)将dp单位转换到px单位,或用view.removeFromParent()方法从父视图中删除一个视图时,是非常有趣的。它们都是我需要的方法。
现在,我已经可以如同它们是Android SDK的一部分使用它们了。
Realm遇到Kotlin:能力更强大
所有这些促使我编写小型扩展库简化Realm的用法。
如果你已经试用(且忍受)Android的Realm,你就应该知道它包含一些通用操作的模板。另外,它有些限制使其变得复杂,如需要人为打开和关闭Realm实例,且要在同一个线程中执行。
另一个限制是,你没有先从Realm解开不同线程之间的链接,那么你就不能在它们之间传递你的查询结果。即使你要执行的是单一操作,你还必须注意事务管理。
有些很烦人的限制例子,你必须意识到它们在未来避免这些问题。
我编写这个库的目的是要将Realm API转换我所喜欢的那样。我要忽略所有Realm的限制,使其工作在更高的抽象层上。
这个库的名称是Kotlin Realm Extensions(Kotlin Realm扩展),你可以在这里找到。
它使用起来非常简单。首先,你必须包含以下依赖关系到你的build.gradle文件中:
compile 'com.github.vicpinm:krealmextensions:1.0.4'
其次,你应该知道这个库能为你做什么:
- 获得默认的Realm实例,在事务完成后关闭它。
- 启动和提交事务。
- 在其它线程中,为使Realm对象之间工作,断开它们的链接。
- 在主线程中执行可观察的查询(Realm要求这类查询)
最后,我们必须做下列工作。看看一些例子:
以Java持久化实体
User user = new User("John"); Realm realm = Realm.getDefaultInstance();
try{
realm.beginTransaction();
realm.copyToRealmOrUpdate(user);
realm.commitTransaction();
} finally {
realm.close();
}
等效的Kotlin Realm扩展
User("John").save()
我们还可以有saveAll()方法用于数组和集合。
以Java查询所有给定类型的实体
Realm realm = Realm.getDefaultInstance();
try {
List events = realm.where(Event.class).findAll();
events = realm.copyFromRealm(event);
} finally {
realm.close();
}
等效的Kotlin Realm扩展
val events = Event().allItems
我们也能以简单的方法执行条件查询:
val events = Event().query { it.equalTo("id",1) }
Lambda表达式可以以参数形式接收RealmQuery实例,这样我们就可以与我们的条件执行查询。
我们还能实时观察和监听数据变化执行我们的查询。这在Realm中可能是相当乏味的:
Realm realm = Realm.getDefaultInstance();
Observable<List> obs = realm.where(Event.class).findAllAsync()
.asObservable()
.filter(RealmResults::isLoaded)
.map(realm::copyFromRealm)
.doOnUnsubscribe(() -> realm.close());
所有这些被简化的相当简单:
val obs = Event().allItemsAsObservable
或你要条件约束查询:
val obs = Event().queryAsObservable { it.equalTo("id",1) }
这是你可达到的高度抽象的小型例子。完整的文档在GitHub站点上提供。
结论
如你所见,在某些环境下,扩展用法能最大限度地简化我们代码。
随然,我仍认为应该谨慎使用扩展,应该避免滥用它们。但是,充分利用好这个特性能够提升我们代码的可读性和可维护性,并且我认为这个库是一个好例子。
我鼓励你去试用它,留下你的意见。
作者介绍
Víctor Manuel Pineda是Kotlin Realm扩展库的开发者。他是DIGIO Soluciones Digitales 的Android和iOS开发工程师。
Kotlin将Realm提升到更高层次的更多相关文章
- 高层次综合(HLS)-简介
本文是我近段时间的学习总结,主要参考了Xilinx的技术文档以及部分网上其他资料.文档主要包括ug998<Introduction to FPGA Design Using High-Level ...
- 声明式编程——抽象程度更高,关注是什么(what),而非如何做(how)
CSDN:AngularJS的设计理念是什么?灵感来自于什么? Misko:AngularJS遵循的设计理念是--构建UI应该是声明式的.这也是AngularJS中标识符(directives)想法的 ...
- Spring AOP中的JDK和CGLib动态代理哪个效率更高?
一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理, ...
- Clear Linux 为脚本语言提供更高的性能
导读 Clear Linux的领先性能不仅限于C/C++应用程序,而且PHP,R和Python等脚本语言也有很大的提升速度.在一篇新的博客文章中,英特尔的一位开发人员概述了他们对Python的一些性能 ...
- 译:ORCFILE IN HDP 2:更好的压缩,更高的性能
原文地址: https://hortonworks.com/blog/orcfile-in-hdp-2-better-compression-better-performance/ ORCFILE I ...
- Kotlin 特性 语法糖 优势 扩展 高阶 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- mysql的SQL_CALC_FOUND_ROWS 使用 类似count(*) 使用性能更高
mysql的SQL_CALC_FOUND_ROWS 使用 类似count(*) 使用性能更高 在很多分页的程序中都这样写: SELECT COUNT(*) from `table` WHERE ... ...
- 数据库查询SQL语句的时候如何写会效率更高?
引言 以前刚开始做项目的时候,开发经验尚浅,遇到问题需求只要把结果查询出来就行,至于查询的效率可能就没有太多考虑,数据少的时候还好,数据一多,效率问题就显现出来了.每次遇到查询比较慢时,项目经理就会问 ...
- AliIAC 智能音频编解码器:在有限带宽条件下带来更高质量的音频通话体验
随着信息技术的发展,人们对实时通信的需求不断增加,并逐渐成为工作生活中不可或缺的一部分.每年海量的音视频通话分钟数对互联网基础设施提出了巨大的挑战.尽管目前全球的互联网用户绝大多数均处于良好的网络状况 ...
随机推荐
- ELF格式文件符号表全解析及readelf命令使用方法
http://blog.csdn.net/edonlii/article/details/8779075 1. 读取ELF文件头: $ readelf -h signELF Header: Magi ...
- 数集合有多少个TOJ(2469)
题目链接:http://acm.tju.edu.cn/toj/showp2469.html 感觉这个题目有点问题,算了不管他了,反正A了. 这里要注意的是求这个集合有多少种,那么就是要剔除重复数后,再 ...
- linux .h .so .a文件
在linux开发中,完全不使用第三方库的情况比较少见,通常都需要借助一个或多个函数库的支持才能完成相应功能.从程序员角度看,函数库实际上是一些头文件(.h)和库文件(.so或.a)的集合.linux下 ...
- c#中的 MessageBox 弹出提示框的用法
MessageBox.Show(<字符串str> Text, <字符串str> Title, <整型int> nType,MessageBoxIcon); 例:Me ...
- Spring 远程调用工具类RestTemplateUtils
Spring 远程调用Rest服务工具类,包含Get.Post.Put.Delete四种调用方式. 依赖jar <dependency> <groupId>org.spring ...
- (jdbc和cmd)sqlite数据迁入mysql(导入导出)
从sqlite进行导出数据 进行cmd命令 第一步:sqlite3->.open [文件路径](打开连接)->.tables(这个是查看表是否有没有)->.cd [切换的盘符](这里 ...
- jquery 表单事件
.blur() 当元素失去焦点的时候触发事件. .blur(handler(eventObject)) handler(eventObject) 每当事件触发时候执行的函数. .blur([event ...
- Web as a App(Web既APP)的概念可以提出吗?
Web as a App (WaaA),Web既APP.灵感出于SaaS.PaaS.IaaS等~ 最近在做一个PC项目,即便我的项目是to B的,用户量没那么大,但是我仍然很注重性能及用户体验,我把我 ...
- lintcode_111_爬楼梯
爬楼梯 描述 笔记 数据 评测 假设你正在爬楼梯,需要n步你才能到达顶部.但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部? 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的 ...
- Anaconda下安装 TensorFlow 和 keras 以及连接pycharm
首先在官网下载Anaconda https://www.anaconda.com/download/ 安装时注意 勾选第一个,增加环境变量 安装好后再windows界面打开Anaconda Promp ...