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

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