Slide 1

Slide 1 text

Go reactive with Realm and Xamarin Forms Andrea Ceroni [email protected] @andrekiba6 Sponsored by 25 ottobre 2018 Relatore

Slide 2

Slide 2 text

Go reactive with Realm and Xamarin Forms Tipo di sessione: Frontale Durata sessione: 50min

Slide 3

Slide 3 text

Realm + Xamarin.Forms

Slide 4

Slide 4 text

Xamarin.Forms

Slide 5

Slide 5 text

cosa è Realm? Reactive Mobile Database with Live Objects

Slide 6

Slide 6 text

caratteristiche non è un ORM costruito su SQLite o simili non è un Key-Value store (JSON) ma un db a tutti gli effetti completamente riscritto, core in C++ (open source) Swift, Objective-C, Java, JavaScript .NET con Xamarin (iOS, Android, Mac, UWP, .NET Framework) client + server (pensato per essere offline first)

Slide 7

Slide 7 text

ok ma come si presenta? varrealm =Realm.GetInstance(config);

Slide 8

Slide 8 text

perchè Realm?

Slide 9

Slide 9 text

R A B C D E V1 1) R A B C D E V1 2) R1 A1 C1 V2 R1 A1 B C1 D E V2 3) R A C garbage MVCC (multiversion concurrency control)

Slide 10

Slide 10 text

native objects ORM traduce in istruzioni SQL crea connessione DB invia le istruzioni al disco esegui la query leggi i dati deserializza e copia in formato intermedio in memoria ritorna gli oggetti finali copia in memoria in formato appropriato per il linguaggio native objects realm db file virtual memory mapped native links zero copy e native links

Slide 11

Slide 11 text

lazy loading non si può leggere meno di una "pagina" però le proprietà sono gruppate "in verticale" le proprietà non utilizzare non vengono lette si evitano inutili accessi al disco

Slide 12

Slide 12 text

transactions objects modify notifications trigger queries make up UI events, network, ... 4 concepts

Slide 13

Slide 13 text

public class Dog : RealmObject { [MapTo("name")] [Required] public string Name { get; set; } public int Age { get; set; } public Person Owner { get; } } public class Person : RealmObject { [PrimaryKey] public int Id { get; set; } public string Name { get; set; } public IList Dogs { get; } } to one to many inverse [Backlink(nameof(Dog.Owner))] public IQueryable Dogs { get; } objects

Slide 14

Slide 14 text

var artu = realm.Find(6); IQueryable puppies = realm.All() .Where(d => d.Age < 2); var mila = realm.All() .FirstOrDefault(d => d.Name == "Mila"); https://realm.io/docs/dotnet/latest/api/linqsupport.html queries

Slide 15

Slide 15 text

realm.RealmChanged += (s, e) => { //do something } var subscription = realm.All() .SubscribeForNotifications((sender, changes, error) => { //cosa è stato inserito, elimintato, modificato }); //later subscription.Dispose(); var mila = new Dog(); realm.Write(() => realm.Add(mila)); mila.PropertyChanged += (sender, e) => { //do something } notifications

Slide 16

Slide 16 text

var realm = Realm.GetInstance(configuration); realm.Write(() => { var andre = realm.Add(new Person() { Id = 6, Name = "Andrea" }); var mila = new Dog() { Name = "mila", Age = 1, } andre.Dogs.Add(mila); mila.Owner = andre; }); transactions

Slide 17

Slide 17 text

Realm Mobile Platform Realm Database + Realm Object Server

Slide 18

Slide 18 text

https://realm.io/products/realm-studio/ Realm Object Server

Slide 19

Slide 19 text

REST sync

Slide 20

Slide 20 text

REST sync

Slide 21

Slide 21 text

2-way sync

Slide 22

Slide 22 text

var credentials = Credentials.UsernamePassword("username", "pass"); var authUrl = new Uri("http://realmAuthServerAddress:9080"); var user = await User.LoginAsync(creadentials, authUrl); var serverUrl = new Uri("realm://realmServerAddress:9080/~/default"); var syncConfig = new SyncConfiguration(user, serverUrl); var realm = Realm.GetInstance(syncConfig); var realm = await Realm.GetInstanceAsync(syncConfig); autenticazione e sync configuration

Slide 23

Slide 23 text

Demo

Slide 24

Slide 24 text

realm.All() .SubscribeForNotifications((...) => { if(iKnowTheAnswerJ) Answer(); });

Slide 25

Slide 25 text

Grazie!