Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Hablemos de Realm

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Hablemos de Realm

Presentación de Realm. Un revolucionario sistema de bases de datos enfocado en mobile y que se plantea como la gran alternativa a sistemas como CoreData o SQLite

Avatar for Pedro Piñera Buendía

Pedro Piñera Buendía

March 05, 2015
Tweet

More Decks by Pedro Piñera Buendía

Other Decks in Technology

Transcript

  1. De qué no hablaré hoy » API de Realm »

    Cómo usar Realm www.realm.io Entonces? » Qué aporta nuevo/mejor Realm » Ventajas/Inconvenientes
  2. Historias de las bases de datos para móviles » Datos

    para poco almacenamiento, memoria y potencia de procesado. » La compresión no es una opción » Realm, empaquetado de bits inteligente, vectorización ARM, y layouts de tablas eficiente. » Lanzado para iOS en 2014
  3. » NoSQL » Fast (not an ORM) » Miles de

    desarrolladores ya usándolo » Orientada a objetos & modelos » Modelo de threads bien definido (GCD) » Multi plataforma, core en C++ con bindings en distintos lenguajes
  4. iOS Core Data NSManagedObjectContext *moc = [self managedObjectContext]; NSEntityDescription *entityDescription

    = [NSEntityDescription entityForName:@"Dog" inManagedObjectContext:moc]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:entityDescription]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"color = 'tan' AND name BEGINSWITH 'B'"]; [request setPredicate:predicate]; NSError *error; NSArray *array = [moc executeFetchRequest:request error:&error]; Realm RLMResults *tanDogs = [Dog objectsWhere:@"color = 'tan' AND name BEGINSWITH 'B'"]; MagicalRecord !
  5. Orientado a objetos/modelos // Modelo Person class Person: RLMObject {

    dynamic var name = "" dynamic var birthdate = NSDate(timeIntervalSince1970: 1) dynamic var dogs = RLMArray(objectClassName: Dog.className()) } Person.objectsWhere(...) Person.objectsWithPredicate(...) Person.all().arraySortedByProperty()
  6. public class User extends RealmObject { @PrimaryKey private String name;

    private int age; @Ignore private int sessionId; // Getters y Setters generados por el IDE public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getSessionId() { return sessionId; } public void setSessionId(int dontPersist) { this.sessionId = sessionId; } }
  7. Modelo de threas bien diseñado 1.Pides el Realm correspondiente al

    contexto 2.Ejecuta la query/creación/edición/eliminación 3.Cierra el Realm ene se thread, close() Realm, RealmObject o RealmResults no se pueden pasar entre threads Realm.getInstace() devuelve singleton en el thread
  8. ¡No puede ser más sencillo! protected Long doInBackground(Context... contexts) {

    Realm = null; try { realm = Realm.getInstance(contexts[0]); // ... Use the Realm instance } finally { if (realm != null) { realm.close(); } } }
  9. Swift dispatch_async(queue) { let realm = RLMRealm.defaultRealm() for idx1 in

    0..<1000 { realm.beginWriteTransaction() // Operaciones realm.commitWriteTransaction() } }
  10. Puedes elegir donde almacenar Realm También en una linea de

    código iOS [RLMRealm realmWithPath:'love.realm'] [RLMRealm realmWithPath:'love.realm' readOnly:NO error:&error] Android Realm realm = Realm.getInstance(this, "love.realm");
  11. Encriptado iOS Usando NSFileProtection Sólo dos "pegas": 1. Sólo disponible

    para iOS 2. Sólo en devices protegidos con contraseña // Genera una clave de encriptado aleatoria NSMutableData *key = [NSMutableData dataWithLength:64]; SecRandomCopyBytes(kSecRandomDefault, key.length, (uint8_t *)key.mutableBytes); // Establece dicha clave para del Realm por defecto [RLMRealm setEncryptionKey:key forRealmsAtPath:RLMRealm.defaultRealmPath];
  12. Encriptado Android byte[] key = new byte[32]; new SecureRandom().nextBytes(key); Realm

    realm = Realm.create(this, key); Tienes que compilar Realm partiendo del código fuente
  13. Notificaciones Detecta cuando se producen operaciones de escritura // iOS

    self.token = [realm addNotificationBlock:^(NSString *note, RLMRealm * realm) { [myViewController updateUI]; }]; // Android realm.addChangeListener(new RealmChangeListener() { @Override public void onChange() { // Puedes actualizar la UI con los cambios } });
  14. ¿Qué pasa si cambia tu modelo de datos? Que no

    puedes olvidar MIGRAR (O tu aplicación se quejará con un repentino Crash) // Antes de inicializar la base de datos [RLMRealm setSchemaVersion:1 forRealmAtPath:[RLMRealm defaultRealmPath] withMigrationBlock:^(RLMMigration *migration, NSUInteger oldSchemaVersion) { if (oldSchemaVersion < 1) { [migration enumerateObjects:Person.className block:^(RLMObject *oldObject, RLMObject *newObject) { newObject[@"fullName"] = [NSString stringWithFormat:@"%@ %@", oldObject[@"firstName"], oldObject[@"lastName"]]; }]; } }];
  15. Parseado de JSON (Sólo iOS) NSArray *venues = json[@"venues"]; RLMRealm

    *realm = [RLMRealm defaultRealm]; [realm beginWriteTransaction]; for (NSDictionary *venue in venues) { [Venue createOrUpdateInDefaultRealmWithObject:venue]; } [realm commitWriteTransaction];
  16. Swift Friendly (Super friendly) Wrapping an Objective-C framework with Swift

    by @jpsimard Generics, type safety, Swift objects, closures, tuples, super-enums, functional programming
  17. 1.Simple -> Desarrollo más rápido 2.Rápido -> Núcleo más optimizado

    que otras soluciones 3.Activo -> Desarrollo continuo y al día en features
  18. 1.Simple -> Desarrollo más rápido 2.Rápido -> Núcleo más optimizado

    que otras soluciones 3.Activo -> Desarrollo continuo y al día en features 4.Grandes empresas ya lo usan -> (e.g Groupon) Ahorrarás muchos dolores de cabeza al trabajar con contextos, threads y podrás enfocarte en la app
  19. » (iOS) No soporta KVO » No se pueden pasar

    RLMObjects, RLMResults y RLMRealm entre threads » Soporte para migraciones feature WIP » Los ficheros de Realm sólo pueden ser accedidos por un Realm al mismo tiempo » Notificaciones con poca información » (iOS) NSDates truncados al segundo