38
Realm.io The brand new database for mobile apps © Clément Sauvage - Cocoaheads Paris - Nov. 2014

Realm.io par Clement Sauvage

Embed Size (px)

Citation preview

Realm.ioThe brand new database for mobile apps

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

This conf could be named :

Data persistency#FingerInTheNose

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Who's that guy ?

Clément Sauvage24 years old

Lille, FranceWeb developer since 2004iOS & OS X Developer since 2009

@clementsauvage @csauvage on GitHub

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

A bit moreFounded an mobile agency KalokodMostly iOS/Android & Web consulting

Teacher @ Supinfo (Where I studied);Teacher @ #SupDeWeb

Cocoaheads Lille Organizer

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Let's talk

Database& data persistency

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

iOS Data StorageFew ways

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

.plist files(Yep, it still exist !!)

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

SQLite storage engineBut no official wrapper (Ok there's FMBD)

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

CoreDataNot properly a storage engine

Quite difficult to learn

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

And nowLet me introduce...

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Amazingly simpleMy little sister could do it

(Uh... wait... I haven't any sister)

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Instanciate it

[Realm defaultRealm]

or[Realm realmWithPath:@"cocoaheadsMembers.realm"]

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Data model

You know how to design ObjC classes right ?So, you know how to use Realm !@interface CSPeople:RLMObject

@property NSString *name;@property NSString *job;@property int age;@property float height@property (ignored) float AMEXCardNumber

That's all#FingerInTheNose© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Writing

Let's record that in a realm

CSPeople *obiWanKenobi = [[CSPeople alloc]init];obiWanKenobi.name = @"Obi Wan Kenobi";obiWanKenobi.job = @"Jedi";obiWanKenobi.age = 57;obiWanKenobi.height = 1.82;

RLMRealm *starWarsVII = [RLMRealm defaultRealm];//Once per thread

[starWarsVII beginWriteTransaction];[starWarsVII addObject:author];[starWarsVII commitWriteTransaction];

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Queries

As simple as an NSPredicateRLMArray *starWarsQuery = [starWarsVII objectsWhere:@"job = 'jedi' AND name BEGINSWITH 'O'"];

And using an NSPredicate objectNSPredicate *jediPredicate = [NSPredicate predicateWithFormat:@"job = %@ AND name BEGINSWITH %@", @"jedi", @"O"]RLMArray *starWarsQuery2 = [starWarsVII objectsWithPredicate:jediPredicate];

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Sorted Request

Querying is good, but what about sorting ?There's an app method for that !RLMArray *sortedSiths = [[starWarsVII objectsWhere:@"job = 'sith'"]arraySortedByProperty:@"name" ascending:YES];

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Nested Calls

RLMArray *SWVIISith = [starWarsVII objectsWhere:@"job = 'sith'"];

RLMArray *SWVIIBSith = [SWVIISith objectsWhere:@"name BEGINSWITH 'B'"];

Awesome isn't it ?

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Relations

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Many to one

Let me introduce the Death Star, a spaceship !@interface CSSpaceShip:RLMObject

@property NSString *name;@property CSPeople *pilot;@property int numberOfPassengers;@property float speed;

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Many to many

Ok, let's imagine we want to store all pasengers of a spaceShip

Back to our CSPeople model@interface CSPeople:RLMObject

@property NSString *name;(...)@property (ignored) float AMEXCardNumber

@end

RLM_ARRAY_TYPE(CSPeople)

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Many to many

Back to our CSSpaceShip model@interface CSSpaceShip:RLMObject

@property NSString *name;@property CSPeople *pilot;@property int numberOfPassengers;@property float speed;@property RLMArray<CSPeople> *passengers

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Many to manyLet's add few stormtroopersRLMArray *stormTroopers = [StarWarsVII objectsWhere:@"jobs = 'stormstrooper'"];[deathStar.passengers addObjectsFromArray:stormTroopers];

#FingerInTheNose

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Migrations

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

// In [AppDelegate didFinishLaunchingWithOptions:]

[RLMRealm migrateDefaultRealmWithBlock:^NSUInteger(RLMMigration *migration, NSUInteger oldSchemaVersion) { // We haven’t migrated anything yet, so oldSchemaVersion == 0

if (oldSchemaVersion < 1) {

/* The enumerateObjects:block: method iterates over every 'CSPerson' object stored in the Realm file */

[migration enumerateObjects:CSPerson.className block:^(RLMObject *oldObject, RLMObject *newObject) {

// combine name fields into a single field newObject[@"fullName"] = [NSString stringWithFormat:@"%@ (%@)", oldObject[@"name"], oldObject[@"job"]]; }]; } // Return the latest version number (always set manually) // Must be a higher than the previous version or an RLMException is thrown return 1;}];

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

You want more ?

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

There's a lot of things to say about Realm

(Browser, Notifications, Background Operations, Usage w/ RESTful APIs...)But not enough time, unfortunately !

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Realm is available now, for free

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Hey ! I already use Core Data/SQLite, why the hell should I change ?

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Questions ?

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

One more thing...I have few T-Shirts & Stickers for you !

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

Thanks for listeningFollow @clementsauvage on Twitter

Find my thoughts on http://csauvage.github.io

© Clément Sauvage - Cocoaheads Paris - Nov. 2014

© Clément Sauvage - Cocoaheads Paris - Nov. 2014