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

Hablemos de Realm

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

B0a336761194918a853deeff1f22b537?s=128

Pedro Piñera Buendía

March 05, 2015
Tweet

More Decks by Pedro Piñera Buendía

Other Decks in Technology

Transcript

  1. Hablemos de Realm REALM

  2. ¿Quién soy yo? Pedro Piñera @pepibumur /github/pepibumur Desarrollador lead mobile

    en 8fit
  3. De qué no hablaré hoy » API de Realm »

    Cómo usar Realm www.realm.io Entonces? » Qué aporta nuevo/mejor Realm » Ventajas/Inconvenientes
  4. ¿Por qué se desarrolla Realm?

  5. 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
  6. ¿Qué es Realm? De acuerdo con Realm

  7. » 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
  8. Open Source github.com/realm (Todo menos el Core)

  9. ¡Quiero saber más!

  10. ¿Qué ofrece Realm?

  11. » Escrituras » Lecturas » Queries » Eliminación » Migraciones

    » ...
  12. Nada en especial ! (Te equivocas !)

  13. Fácil de instalar y configurar en tu proyecto.

  14. iOS » Manualmente » Cocoapods o Carthage » Framework dinámico

    (iOS 8) Android » Maven » Jar
  15. Nada de complejos stacks

  16. NSManagedObjectContext

  17. Adiós » Cursores » SQLiteDatabases » SQLiteHelpers » Complejas queries

  18. ! [RLMRealm defaultRealm]; Realm.getInstance(Context context);

  19. Interfaz fluent ! (Código más legible) Wikipedia

  20. 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 !
  21. Android SQLite //http://www.mysamplecode.com/2011/10/android-sqlite-query-example-selection.html Realm RealmQuery<User> query = realm.where(User.class).equalTo("name", "John").findAll(); SugarORM

    !
  22. Performance !

  23. None
  24. None
  25. 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()
  26. 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; } }
  27. No necesitas conocer las estructuras resultantes Disfruta trabajando con los

    modelos !
  28. 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
  29. ¡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(); } } }
  30. Swift dispatch_async(queue) { let realm = RLMRealm.defaultRealm() for idx1 in

    0..<1000 { realm.beginWriteTransaction() // Operaciones realm.commitWriteTransaction() } }
  31. 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");
  32. Muy útil para tests RLMRealm *testRealm = [RLMRealm realmWithPath:kTestRealmPath];

  33. Encriptado

  34. 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];
  35. 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
  36. 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 } });
  37. No puedes saber qué ha cambiado Simplemente que "algo" se

    ha escrito en Realm
  38. Migraciones

  39. ¿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"]]; }]; } }];
  40. Migraciones en Android ! (WIP)

  41. 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];
  42. Android Friendly con concidas librerías Other libraries - GSON -

    Otto - Retrofit - RoboElectric
  43. Swift Friendly (Super friendly) Wrapping an Objective-C framework with Swift

    by @jpsimard Generics, type safety, Swift objects, closures, tuples, super-enums, functional programming
  44. Activamente desarrollado Con bastante comunidad en el poco tiempo de

    vida
  45. Ventajas (de usar Realm)

  46. 1.Simple -> Desarrollo más rápido

  47. 1.Simple -> Desarrollo más rápido 2.Rápido -> Núcleo más optimizado

    que otras soluciones
  48. 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
  49. 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
  50. Desventajas Y limitaciones

  51. » (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
  52. Recursos » Realm.io » @jpsimard talks » Newsletter recomendado »

    Tutorial RayWenderlich » Github
  53. ¿Dudas?