2. About Realm
• Headquartered in San Francisco, with engineering office
in Copenhagen
• ~50 employees
• Series B startup, $29M raised
3. Realm Mobile Database
• On-device cross-platform object database
• Launched July 2014
• Developed in the open, fully open source
• 16K+ GitHub stars, 100K+ active developers
7. Users Expect More of Apps Today
• Offline first: They need apps that work well offline and when network
connections are intermittent
• Reactive: They expect apps that are highly responsive, with all changes
immediately reflected in the UI
• Real-time: They expect every user and device to stay in sync with each
other in real-time
• Collaborative: They want highly collaborative features and experiences
within their apps
• Seamless: They expect to be able to move seamlessly from device to device
13. Developer priorities
• Time-to-market: Your team need to be able to deliver quality apps
quickly and on time
• Ability: With high user expectations, the team need the ability to easily
add advanced features like data sync, messaging and collaboration.
• Cross-platform: To reach the full audience, you need to be able to
deliver apps for both iOS and Android
• Standardize: To manage all the apps and reduce complexity, you want
to standardize on a single platform
16. REST is brittle and cumbersome in a mobile world
• What happens when there is no connectivity?
• Queueing?
• Persistence?
• What about connectivity being lost during requests?
• Tokens? Do they have to be persisted in app?
• State-full services?
• Resource intensive
• Need for multiple REST calls. High latency cost
• Often incurs duplication of data
• JSON parsing is expensive
17. Delivers Key Mobile Solutions
• Eliminates network challenges
• Simplifies data architecture
• Unlocks existing infrastructure
18. SDK
1
2
• Offline-first
• Full database on the device
• Queries run locally
• Writes apply immediately
• Reactive architecture keeps UI up-to-date
• Automatic sync happens in the background
• Resilient to any network conditions
Eliminate Network Challenges
28. • It’s just objects
on the device and on the server
• Objects are live,
they update—automatically and
immediately—in response to changes
• Not an ORM,
the database is the data model
• Easier for developers
to build, change, maintain
• Reduce code complexity
via unified data format; cross-platform
• Encrypted at rest & transitObjects all the way down
Simplify Data Architecture
29. Delivers Key Mobile Solutions
• Eliminates network challenges
• Simplifies data architecture
• Unlocks existing infrastructure
30. Legacy Systems Hold Back Mobile
XML JSON
RESTSOAP
/facilities /departments
{"facility": "west-1A",
"departments": [
{"type": "manufacturing"},
{"type": "operations"}]
}
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<department>manufacturing</department>
<facilities>west-1A</facilities>
</root>
31. Unlock Existing Infrastructure
DC9WP
Coupon:
Coupon:
DC9WP
coupon.code = DC9WP
coupon.isValid = true
1
2
3
• Bridge legacy APIs
• Shift complexity to backend
• Node.js SDK
• Identical object interface
• Full database capabilities
• Apply changes to push data
• Event framework
• Listen and respond to changes from clients
• Pass along data to other systems or databases
• Supports custom authentication
34. Create native objects that map
directly to the database.
// Define you model class by extending RealmObject
public class Dog extends RealmObject {
public String name; // fields can also be private of course
public int age = 1; // default values
}
public class Person extends RealmObject {
@PrimaryKey
public long id;
public String name; // support for custom logic in accessors
public RealmList<Dog> dogs; // declare one-to-many relationships
}
35. Perform complex queries across
your object graph
RealmResults<User> result2 = realm.where(User.class)
.equalTo("name", "John")
.or()
.equalTo("name", "Peter")
.findAll();
RealmResults<User> result = realm.where(User.class).findAll();
result = result.sort("age"); // Sort ascending
result = result.sort("age", Sort.DESCENDING);
36. All changes occur in transactions
offering ACID compliance
// Obtain a Realm instance
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
Book cheeseBook = realm.createObject(Book.class);
cheeseBook.title = "Gouda Recipes";
cheeseBook.id = 1;
realm.commitTransaction();
39. Realm is a live object database
Realm is an object database
40. Listen for live object changes
to simplify your architecture
RealmResults<Person> persons = realm.where(Person.class).findAll();
persons.addChangeListener(new RealmChangeListener() {
@Override
public void onChange(RealmResults<Person> change) {
// ... do something with the updates (UI, etc.) ...
}
});
41. Now imagine if these live-updates
came from remote changes?
42. Realm Object Server synchronizes
object changes in real-time.
Server-side Realms
Device-side Realms
Realm Object Server
Real-time Sync
44. Authenticating a user
SyncCredentials me = SyncCredentials.usernamePassword(username, password, true);
String authURL = "http://my.realm-auth-server.com:9080/auth";
SyncUser user = SyncUser.login(me, authURL);
45. Open a Realm instance
and get ready for
synchronization
RealmConfiguration conf = new RealmConfiguration.Builder().build();
String serverURL = "realm://my.realm-server.com/~/default";
SyncConfiguration conf = new SyncConfiguration.Builder(user, serverURL).build();
Realm realm = Realm.getInstance(conf);
// Any changes made to this Realm will be synced across all devices!
47. Conflict Resolution
• Operational Transform
• Well-known documented solution.
• Guarantee convergence.
• At field level
• Delete always wins
• Last write wins
• Inserts in Lists are ordered by time
• https://realm.io/docs/realm-object-server/#conflict-resolution
49. Benefits for developers
• Networking abstracted away. No need to worry about
connectivity, JSON parsing, object mapping…
• Unified Data Model. Same data format and reactivity on
Client and Backend.
• Straight line from Server to UI. Data can be bound
directly to UI on Client.