Realm
Erick Camacho @ecamacho
NSCoderMéxico
15 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
Dubsmash
iOS & 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 chainable
r = [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 key
let key = NSMutableData(length: 64)!
SecRandomCopyBytes(kSecRandomDefault, UInt(key.length),
UnsafeMutablePointer<UInt8>(key.mutableBytes))
// Open the encrypted Realm file
var 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

Realm para iOS

  • 1.
  • 3.
  • 4.
    Realm es una opciónmás sencilla
  • 5.
  • 6.
    • Es unabase 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.
  • 7.
    • El desarrolloempezó 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á
  • 8.
  • 9.
  • 10.
    Dubsmash iOS & Android #1app en >40 países >10M instalaciones en Android
  • 11.
    Wahoo #1 fitness appen >120 países
  • 12.
    En Nubleer lo usamosdesde hace 11 meses en producción
  • 13.
    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)
  • 14.
  • 15.
  • 16.
    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) }
  • 17.
    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 } })
  • 18.
    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);
  • 19.
    Queries Objective-C RLMResults *r= [Dog objectsWhere:@"age > 8"]; // Queries are chainable r = [r objectsWhere:@"name contains 'rex'"];
  • 20.
    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]; }];
  • 21.
    Cifrado Swift / Generatea random encryption key let key = NSMutableData(length: 64)! SecRandomCopyBytes(kSecRandomDefault, UInt(key.length), UnsafeMutablePointer<UInt8>(key.mutableBytes)) // Open the encrypted Realm file var error: NSError? let realm = Realm(path: Realm.defaultPath, readOnly: false, encryptionKey: key, readOnly: false, error: &error)
  • 22.
  • 26.
    4. ¿Por quéno usar Realm?
  • 27.
    • SQLite esuno 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)
  • 28.