Realm para iOS

Preview:

Citation preview

RealmErick Camacho @ecamacho

NSCoderMéxico15 julio 2015

CoreData es demasiado

grande / complejo

Realm es una opción más

sencilla

1. ¿Qué es?

• Es una base de datos para móviles: un reemplazo para CoreData y SQLite. El core está construido en C++ (TightDB)

• NO es un ORM, NO está basado en SQLite

• Es una base de datos relacional, no es NoSQL, no es un Key-Value store: columnas, filas, queries, índices.

• El desarrollo empezó en 2011, (en producción desde 2012), es público desde 2012

• Disponible para Objective-C, Java (Android) y Swift. Próximamente para .Net y JS

• El core hecho en C++ todavía no es opensource pero lo será

2. ¿Quién lo usa?

Groupon>100M usuarios

DubsmashiOS & Android

#1 app en >40 países>10M instalaciones en

Android

Wahoo#1 fitness app en >120

países

En Nubleer lo usamos desde hace 11 meses en producción

En 1 año• #1 -apps, Enterprise apps (Rite Aid, SAP, …), Bancos.. -

Corriendo en centenas de millones de dispositivos (la 2a base de datos con más instalaciones en el mundo)

3. ¿Cómo lo uso?

Demo Swift

Relaciones Swift

class Person: Object { dynamic var name = "" dynamic var picture = NSData() let dogs = List<Dog>()}

realm.write { let person = Person() person.name = "Tim" person.dogs.append(mydog)}

Migraciones Swift

setSchemaVersion(1, Realm.defaultPath, { migration, oldSchemaVersion in if oldSchemaVersion < 1 { // Nothing to do! // Realm will automatically detect new properties and removed properties // And will update the schema on disk automatically }})

Models Objective-C

@interface Dog : RLMObject@property NSString *name;@property NSInteger age;@end

Dog *mydog = [[Dog alloc] init];

mydog.name = @"Rex"; NSLog(@"Name of dog: %@", mydog.name);

Queries Objective-C

RLMResults *r = [Dog objectsWhere:@"age > 8"];

// Queries are chainabler = [r objectsWhere:@"name contains 'rex'"];

Relationships Objective-C

@interface Person : RLMObject@property NSString *name;@property NSData *picture;@property RLMArray<Dog> *dogs;@end

[realm transactionWithBlock:^{ RLMPerson *person = [[RLMPerson alloc] init]; person.name = @"Tim"; [person.dogs addObject:mydog];}];

Cifrado Swift

/ Generate a random encryption keylet key = NSMutableData(length: 64)!SecRandomCopyBytes(kSecRandomDefault, UInt(key.length), UnsafeMutablePointer<UInt8>(key.mutableBytes))

// Open the encrypted Realm filevar error: NSError?let realm = Realm(path: Realm.defaultPath, readOnly: false, encryptionKey: key, readOnly: false, error: &error)

Desempeño

4. ¿Por qué no usar Realm?

• SQLite es uno de los proyectos open source más probados en el mundo

• CoreData tiene un gran soporte en Xcode

• Soporte a valores nulos (se está trabajando en ello)

• Pasar objetos entre threads (se está trabajando en ello)

• Key-Value Observing, soporte a RXSwift y ReactiveCocoa (se está trabajando en ello)

• Datos poco estructurados, un schema-less store es mejor (Couchbase, NanoStore, Firebase)

Q&A