• 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文件中:

    1 compile 'com.github.vicpinm:krealmextensions:1.0.4'

    其次,你应该知道这个库能为你做什么:

    • 获得默认的Realm实例,在事务完成后关闭它。
    • 启动和提交事务。
    • 在其它线程中,为使Realm对象之间工作,断开它们的链接。
    • 在主线程中执行可观察的查询(Realm要求这类查询)

    最后,我们必须做下列工作。看看一些例子:

    以Java持久化实体

     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 }

    等效的Kotlin Realm扩展

    1 User("John").save()

    我们还可以有saveAll()方法用于数组和集合。

    以Java查询所有给定类型的实体

    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 }

    等效的Kotlin Realm扩展

    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开发工程师。

  • 相关阅读:
    MySQL Community Server 8.0.16
    Python的编码规范
    Python 的语言特性
    spark笔记 环境配置
    C#委托实现工厂规则注入
    特性与元数据
    可输入的模糊搜索ComBox控件
    ASPX页面输出datatable的一种方法
    QRcode生成二维码,保存二维码图片到服务器
    SQL语句的随机值与行号,字符串拼接
  • 原文地址:https://www.cnblogs.com/figozhg/p/6409713.html
Copyright © 2020-2023  润新知