29
Realm and Lessons Learned building it {MBLT}DEV ‘14 Brian Munkholm, VP Engineering @realm [email protected] @brianMunkholm

#MBLTdev: Уроки, которые мы выучили, создавая Realm

Embed Size (px)

DESCRIPTION

#MBLTdev: Конференция мобильных разработчиков Спикер: Brian Munkholm VP Engineering, Realm http://mbltdev.ru/

Citation preview

Page 1: #MBLTdev: Уроки, которые мы выучили, создавая Realm

Realm and Lessons Learned building it

{MBLT}DEV ‘14

Brian Munkholm, VP Engineering @realm [email protected] @brianMunkholm

Page 2: #MBLTdev: Уроки, которые мы выучили, создавая Realm

Menu:What is Realm? How popular? Why use Realm? Feedback Design goals & fulfilment - API examples Lessons Learned The future

Page 3: #MBLTdev: Уроки, которые мы выучили, создавая Realm

What is Realm? • Modern mobile database - replace SQLite+ORMs • Easy: Object-oriented, but not an ORM • Safe: full ACID properties • Cross-platform: C++ core (3 years dev) • Small: compact data, object == DB (no copy!) • Fast • Free: open source!

Page 4: #MBLTdev: Уроки, которые мы выучили, создавая Realm

Realm for iOS Used by >20,000 developers worldwide in < 8 weeks!

Including ~1,000 in or very close to production

>2200 GitHub Stars!

(Parse: 10k in 8 mon)

Page 5: #MBLTdev: Уроки, которые мы выучили, создавая Realm

Realm for Android - launched 1 month ago Used by >5,000 developers worldwide the 1’st week!

First apps in production

>700 GitHub Stars in 2 weeks (GreenDao has 1592, ORMlite 307 after years!)

Page 6: #MBLTdev: Уроки, которые мы выучили, создавая Realm
Page 7: #MBLTdev: Уроки, которые мы выучили, создавая Realm

Why use Realm? - ask the devs!

Page 9: #MBLTdev: Уроки, которые мы выучили, создавая Realm

Cloth

a beautifully designed personal outfit diary

>350k users

Uses Realm for all data handling

took over a 2 year-old codebase and ported it to Realm in 1 day.

clothapp.com reallyseth.com

Page 10: #MBLTdev: Уроки, которые мы выучили, создавая Realm

Beanflow

Full POS & inventory app (w/ offline mode)

Uses Realm as network cache for all data

“I don't have any plans to go back to Core Data anytime soon. I really like Realm.”

sebastiandobrincu.com www.beanflow.com

Page 11: #MBLTdev: Уроки, которые мы выучили, создавая Realm

Common benefits • Save time - save $$$ • Make faster & better apps • Uses less memory and disk • Free (de)serialisation • cross platform (iOS, Android, ++) • cross language

Page 12: #MBLTdev: Уроки, которые мы выучили, создавая Realm

Design Goals

1. Simple

2. Fast 3. Modern

to learnto maintainto use across threads

Page 13: #MBLTdev: Уроки, которые мы выучили, создавая Realm

1. Simple

Page 14: #MBLTdev: Уроки, которые мы выучили, создавая Realm

public class Dog extends RealmObject { // Fields private String name; private int age; // + Getters and Setters… }

Models

Page 15: #MBLTdev: Уроки, которые мы выучили, создавая Realm

// Obtain a Realm instance in each thread Realm realm = Realm.getInstance(this);

// ACID transactions give you easy thread-safety realm.beginTransaction();

Dog dog = realm.createObject(Dog.class); dog.setName("Rex"); dog.setAge(3);

// Full commit to disk (or memory) realm.commitTransaction();

Writes

Page 16: #MBLTdev: Уроки, которые мы выучили, создавая Realm

RealmResults<User> teens = realm.where(User.class) .between("age", 13, 20) .findAll();

Queries

// Queries can be chained efficiently RealmResults<User> johns = teens.where() .equalTo("name", “John") .or() .contains("name", “Jo") .findAll();

Page 17: #MBLTdev: Уроки, которые мы выучили, создавая Realm

public class Person extends RealmObject { private String name; private Dog bestDog; // One-One relations private RealmList<Dog> dogs; // One-Many relations … } realm.beginTransaction();

Person person = realm.createObject(Person.class); person.setName("Tim"); person.getDogs().add(dog);

realm.commitTransaction();

Relationships

Page 18: #MBLTdev: Уроки, которые мы выучили, создавая Realm

new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void… voids) {

Realm realm = Realm.getInstance(this); realm.beginTransaction(); Person person = realm.createObject(Person.class); person.setName("Tim"); realm.commitTransaction();

return null; } }.execute();

Thread-safety: All access is the same

Page 19: #MBLTdev: Уроки, которые мы выучили, создавая Realm

• Writes cannot conflict - they block

• No need to merge data sources, ever.

• Reads are consistent as soon as the write completes

Thread-safety:

Page 20: #MBLTdev: Уроки, которые мы выучили, создавая Realm

2. Fast

BIG disclaimer! Use benchmarks as rough indicator Measure your own senarios

Page 21: #MBLTdev: Уроки, которые мы выучили, создавая Realm
Page 22: #MBLTdev: Уроки, которые мы выучили, создавая Realm
Page 23: #MBLTdev: Уроки, которые мы выучили, создавая Realm

Lessons Learned

Page 24: #MBLTdev: Уроки, которые мы выучили, создавая Realm

Lesson one

Aim high! • Worlds best product • Solid funding from the best • 100% dedicated team

Page 25: #MBLTdev: Уроки, которые мы выучили, создавая Realm

Lesson two

Listen to the users / community • Ask users actively • Listen, understand their needs

and react quickly • It takes time!

Page 26: #MBLTdev: Уроки, которые мы выучили, создавая Realm

Lesson three

Performance is great - but usability is king! • and eats performance… • Android/Java reflection is SLOW • but dont’ give up

Page 27: #MBLTdev: Уроки, которые мы выучили, создавая Realm

Add a new object first time

• Runtime code generation • Use lower level APIs • Compile-time code

generation • Cache all the introspection

calls

0

25

50

75

100

Runtime Runtime+ Compile Time Cache

4 sec!!!

Page 28: #MBLTdev: Уроки, которые мы выучили, создавая Realm

The future: • Encryption • Handover results between threads • Dynamic API / Migration • Advanced Query • Synchronisation • What do you want for xmas?

Page 29: #MBLTdev: Уроки, которые мы выучили, создавая Realm

Watch or Influence?

Feedback : realm.io [email protected] #Realm #BrianMunkholm

Thanks for your support!!!