This document provides an overview of using Realm as a mobile database solution instead of SQLite. Some key points:
- Realm stores objects rather than rows/tables and has no boilerplate code for common SQLite tasks like SQL queries.
- Objects are defined by creating RealmObject subclasses with getter/setter properties. These objects can then be stored, queried, and related to each other in the Realm database.
- Relationships between objects can be defined to support one-to-many and many-to-many relationships. Objects are queried using a fluent query language rather than raw SQL.
- Realm uses transactions to ensure data integrity. Objects are added/updated by beginning a transaction, making changes
16. Let’s try something different… Realm
It stores objects
Hierarchical relationships (sort of)
No boilerplate (just probably mappers)
Fast!
Reduces dev time drastically
17. Adding Realm to your project
Your project build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:0.89.0"
}
}
apply plugin: 'realm-android'
Your app build.gradle
18. Realm Objects
public class Minion extends RealmObject {
private String name;
private int eyes;
private boolean goggles;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getEyes() { return eyes; }
public void setEyes(int eyes) { this.eyes = eyes; }
public boolean hasGoggles() { return goggles; }
public void setGoggles(boolean goggles) { this.goggles = goggles; }
}
19. Realm Objects
public class Minion extends RealmObject {
private String name;
private int eyes;
private boolean goggles;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getEyes() { return eyes; }
public void setEyes(int eyes) { this.eyes = eyes; }
public boolean hasGoggles() { return goggles; }
public void setGoggles(boolean goggles) { this.goggles = goggles; }
}
Must extend RealmObject
20. Realm Objects
public class Minion extends RealmObject {
private String name;
private int eyes;
private boolean goggles;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getEyes() { return eyes; }
public void setEyes(int eyes) { this.eyes = eyes; }
public boolean hasGoggles() { return goggles; }
public void setGoggles(boolean goggles) { this.goggles = goggles; }
}
Must extend RealmObject
Not exactly true since last thursday (#$%@!). More later...
21. Realm Objects
public class Minion extends RealmObject {
private String name;
private int eyes;
private boolean goggles;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getEyes() { return eyes; }
public void setEyes(int eyes) { this.eyes = eyes; }
public boolean hasGoggles() { return goggles; }
public void setGoggles(boolean goggles) { this.goggles = goggles; }
}
Object members that will be stored
More on types later
22. Realm Objects
public class Minion extends RealmObject {
private String name;
private int eyes;
private boolean goggles;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getEyes() { return eyes; }
public void setEyes(int eyes) { this.eyes = eyes; }
public boolean hasGoggles() { return goggles; }
public void setGoggles(boolean goggles) { this.goggles = goggles; }
}
Usual getters and setters
24. Storing an object
realm.beginTransaction();
Minion minion = realm.createObject(Minion.class);
minion.setName("Bob");
minion.setEyes(1);
minion.setGoggles(true);
realm.commitTransaction();
realm.cancelTransaction();
or
First, we start a transaction
25. Storing an object
realm.beginTransaction();
Minion minion = realm.createObject(Minion.class);
minion.setName("Bob");
minion.setEyes(1);
minion.setGoggles(true);
realm.commitTransaction();
realm.cancelTransaction();
or
Then we create an instance inside our realm
26. Storing an object
realm.beginTransaction();
Minion minion = realm.createObject(Minion.class);
minion.setName("Bob");
minion.setEyes(1);
minion.setGoggles(true);
realm.commitTransaction();
realm.cancelTransaction();
or
We set the values
27. Storing an object
realm.beginTransaction();
Minion minion = realm.createObject(Minion.class);
minion.setName("Bob");
minion.setEyes(1);
minion.setGoggles(true);
realm.commitTransaction();
realm.cancelTransaction();
or
And commit the transaction. Then, our changes are saved
28. Storing an object
realm.beginTransaction();
Minion minion = realm.createObject(Minion.class);
minion.setName("Bob");
minion.setEyes(1);
minion.setGoggles(true);
realm.commitTransaction();
realm.cancelTransaction();
or
Or we cancel the transaction and the new object is discarded
29. Storing an object - II
Minion minion = new Minion();
minion.setName("Bob");
minion.setEyes(1);
minion.setGoggles(true);
realm.beginTransaction();
realm.copyToRealm(minion);
realm.commitTransaction();
Another way. We create the object outside the realm
30. Storing an object - II
Minion minion = new Minion();
minion.setName("Bob");
minion.setEyes(1);
minion.setGoggles(true);
realm.beginTransaction();
realm.copyToRealm(minion);
realm.commitTransaction();
Then, we begin a transaction, copy the object into the realm, and commit
31. Obtaining your Realm
First, create your Realm configuration
RealmConfiguration config = new RealmConfiguration.Builder(context)
.name("myrealm.realm")
.encryptionKey(getKey())
.schemaVersion(42)
.setModules(new MySchemaModule())
.migration(new MyMigration())
.build();
32. Obtaining your Realm
Then, get an instance
RealmConfiguration config = new RealmConfiguration.Builder(context)
.name("myrealm.realm")
.encryptionKey(getKey())
.schemaVersion(42)
.setModules(new MySchemaModule())
.migration(new MyMigration())
.build();
Realm myRealm = Realm.getInstance(config);
33. Obtaining your Realm
Or use the default Realm Instance
RealmConfiguration config = new RealmConfiguration.Builder(context)
.name("myrealm.realm")
.encryptionKey(getKey())
.schemaVersion(42)
.setModules(new MySchemaModule())
.migration(new MyMigration())
.build();
Realm.setDefaultConfiguration(config);
And obtain it anywhere
Realm realm = Realm.getDefaultInstance();
// Stuff
realm.close();
34. Close your Realms
For each
Realm.getDefaultInstance()
or
Realm.getInstance()
you must execute realm.close() at the end
35. Querying a Realm
Realm uses fluent syntax. Just create a RealmQuery object based on the Realm class you want
RealmQuery<Minion> query = realm.where(Minion.class);
Add operations and filters and execute
RealmResults<Minion> results = query.equalTo(“name”, “Bob”).findAll();
Do something with the result
for (Minion minion:results) {
…. //Do stuff
}
38. Relationships - 1:N
Just have a RealmObject with a RealmObject
public class Minion extends RealmObject {
private String name;
private int eyes;
private boolean goggles;
private Banana banana
//Getters, setters and so on
}
Public class Banana extends RealmObject {
…
}
39. Storing 1:N related objects
realm.beginTransaction()
Banana banana = realm.createObject(Banana.class);
banana.setSomething…
Minion minion = realm.createObject(Minion.class);
minion.setName(“Bob”);
minion.setBanana(banana);
realm.writeTransaction();
40. Relationships - M:N
Just have a RealmObject with a List<? extends RealmObject>
public class Minion extends RealmObject {
private String name;
private int eyes;
private boolean goggles;
private RealmList<Banana> bananas
//Getters, setters and so on
}
Public class Banana extends RealmObject {
…
}
43. Threading
Each Realm should live in the same Thread is has been created
You can’t pass Realms between threads
Realms are automatically updated between threads IF they are in threads with a Looper
Otherwise… Realm.refresh()
45. Brand new changes
This week on Realm:
RealmModel interface + static methods
RealmCollection/RealmOrderedCollection Interfaces
Primary keys can be null!
46. How I use it
public abstract class VOBaseMapper<V extends RealmObject,E> {
public abstract V toVO(E entity);
public abstract E toEntity(V vo) ;
public RealmList<V> toVO(List<E> entities) {
RealmList<V> realmList=new RealmList<V>();
for (E entity:entities) {
realmList.add(toVO(entity));
}
return realmList;
}
47. How I use it
public List<E> toEntity(RealmList<V> vos) {
List<E> applicationEntityList = new ArrayList<>();
for(V vo :vos){
applicationEntityList.add(toEntity(vo));
}
return applicationEntityList;
}
public List<E> toEntity(RealmResults<V> vos) {
List<E> applicationEntityList = new ArrayList<>();
for(V vo :vos){
applicationEntityList.add(toEntity(vo));
}
return applicationEntityList;
}
}
48. How I use it
public class UserVOMapper extends VOBaseMapper<UserVO,User > {
private User user;
@Override
public UserVO toVO(User user) {
UserVO vo=new UserVO();
vo.setName(user.name);
vo.setEmail(user.email);
return vo;
}
@Override
public User toEntity(UserVO vo) {
User user= new User();
user.name=vo.getName();
user.email=vo.getEmail();
return user;
}
}