Giter VIP home page Giter VIP logo

kotlin-realm-extensions's Introduction

Sin título.png

Kotlin extensions to simplify Realm API.

Description

Simplify your code to its minimum expression with this set of Kotlin extensions for Realm. Forget all boilerplate related with Realm API and perform database operations in one line of code with this lightweight library. Full test coverage.

Download for Kotlin 1.2.x and Realm 4.3.x

This version has a breaking change. See changelog for details if you migrate from a previous version.

Grab via Gradle:

repositories {
    mavenCentral()
}

compile "com.github.vicpinm:krealmextensions:2.1.1"

//For Single and Flowable queries:
compile 'io.reactivex.rxjava2:rxjava:2.1.4'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

Previous versions of Kotlin and Realm

  • Version 2.0.0 for Kotlin 1.1.x and Realm 4.1.x
  • Version 1.2.0 for Kotlin 1.1.x and Realm 3.5.x
  • Version 1.0.9 for Kotlin 1.1.x and Realm 3.1.x
  • Version 1.0.6 for Kotlin 1.1.x and Realm 2.2.x

Features

Forget about:

  • Realm instances management
  • Transactions
  • Threads limitations
  • Boilerplate related with Realm API
  • From 2.0 version, your database entities can either extend from RealmObject or implement RealmModule interface.

Usage

All methods below use Realm default configuration. You can use different Realm configurations per model with RealmConfigStore.init(Entity::class.java, myConfiguration). See application class from sample for details. Thanks to @magillus for its PR.

Store entities

All your entities should extend RealmObject.

Before (java)

User user = new User("John");

Realm realm = Realm.getDefaultInstance();
try{
   realm.executeTransaction(realm -> {
      realm.copyToRealmOrUpdate(user);  
   });  
} finally {
   realm.close();
}

After (Kotlin + extensions)

User("John").save()

Save method creates or updates your entity into database. You can also use create() method, which only create a new entity into database. If a previous one exists with the same primary key, it will throw an exception.

Save list: Before (java)

List<User> users = new ArrayList<User>(...);

Realm realm = Realm.getDefaultInstance();
try {
    realm.executeTransaction(realm -> {
        realm.copyToRealmOrUpdate(users);  
    });
} finally {
    realm.close();
}

Save list: After (Kotlin + extensions)

listOf<User>(...).saveAll()

If you need to provide your own Realm instance, you can use the saveManaged(Realm) and saveAllManaged(Realm) methods. These methods return managed objects. You should close manually your Realm instance when you finish with them.

Query entities

  • All query extensions return detached realm objects, using copyFromRealm() method.
  • All query extensions has two versions. One is an extension of RealmModel, and you need to create an instance of that model to perform your query. The other version is a global parametrized funcion (thanks to @PrashamTrivedi). See below examples for details.

Get first entity: Before (java)

Realm realm = Realm.getDefaultInstance();
try {
   Event firstEvent = realm.where(Event.class).findFirst();
   firstEvent = realm.copyFromRealm(event);
} finally {
   realm.close();
}

Get first entity: After (Kotlin + extensions)

val firstEvent = Event().queryFirst() //Or val first = queryFirst<Event> 

You can use lastItem extension too.

Get all entities: Before (java)

Realm realm = Realm.getDefaultInstance();
try {
    List<Event> events = realm.where(Event.class).findAll();
    events = realm.copyFromRealm(event);
} finally {
    realm.close();
}

Get all entities: After (Kotlin + extensions)

val events = Event().queryAll() //Or queryAll<Event>

Get entities with conditions: Before (java)

Realm realm = Realm.getDefaultInstance();
try{
    List<Event> events = realm.where(Event.class).equalTo("id",1).findAll();
    events = realm.copyFromRealm(event);
} finally {
    realm.close();
}

Get entities with conditions: After (Kotlin + extensions)

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

If you only need the first or last result, you can also use:

val first = Event().queryFirst { equalTo("id",1) }
val last = Event().queryLast { equalTo("id",1) }

Get sorted entities

val sortedEvents = Event().querySorted("name",Sort.DESCENDING) 
val sortedEvents = Event().querySorted("name",Sort.DESCENDING) { equalTo("id",1) }

Delete entities

Delete all: Before (java)

Realm realm = Realm.getDefaultInstance();
try{
    List<Event> events = realm.where(Event.class).findAll();
    realm.executeTransaction(realm -> {
        events.deleteAllFromRealm();
    });
} finally {
    realm.close();
}

Delete all: After (Kotlin + extensions)

Event().deleteAll() //Or deleteAll<Event>

Delete with condition: Before (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();
}

Delete with condition: After (Kotlin + extensions)

Event().delete { equalTo("id", 1) }

Observe data changes

Before (java)

Realm realm = Realm.getDefaultInstance();
Flowable<List<Event>> obs =  realm.where(Event.class).findAllAsync()
.asFlowable()
.filter(RealmResults::isLoaded)
.map(realm::copyFromRealm)
.doOnUnsubscribe(() -> realm.close());

After (Kotlin + extensions)

val obs = Event().queryAllAsFlowable() //Or queryAllAsFlowable<Event>

Observe query with condition: Before (java)

Realm realm = Realm.getDefaultInstance();
Flowable<List<Event>> obs =  realm.where(Event.class).equalTo("id",1).findAllAsync()
.asFlowable()
.filter(RealmResults::isLoaded)
.map(realm::copyFromRealm)
.doOnUnsubscribe(() -> realm.close());

Observe query with condition: After (Kotlin + extensions)

val obs = Event().queryAsFlowable { equalTo("id",1) }

These kind of observable queries have to be performed on a thread with a looper attached to it. If you perform an observable query on the main thread, it will run on this thread. If you perform the query on a background thread, a new thread with a looper attached will be created for you to perform the query. This thread will be listen for data changes and it will terminate when you call unsubscribe() on your subscription.

RxJava 2 Single support (thanks to @SergiyKorotun)

val single = Event().queryAllAsSingle()
val single = Event().queryAsSingle { equalTo("id", 1) }

Proguard

You need to add these rules if you use proguard, for rxjava and realm:

-keep class com.vicpin.krealmextensions.** 
-keepnames public class * extends io.realm.RealmObject
-keep class io.realm.annotations.RealmModule
-keep @io.realm.annotations.RealmModule class *
-keep class io.realm.internal.Keep
-keep @io.realm.internal.Keep class *
-dontwarn io.realm.**

kotlin-realm-extensions's People

Contributors

vicpinm avatar victordigio avatar sergiykorotun avatar akshaychordiya avatar s0nerik avatar ravidsrk avatar qiantao94 avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.