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

Go reactive with Realm and Xamarin.Forms

Go reactive with Realm and Xamarin.Forms

Andrea Ceroni

April 14, 2018
Tweet

More Decks by Andrea Ceroni

Other Decks in Programming

Transcript

  1. 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)
  2. MVCC (multiversion concurrency control) 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
  3. zero copy e native links 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
  4. 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
  5. objects 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<Dog> Dogs { get; } } to one to many inverse [Backlink(nameof(Dog.Owner))] public IQueryable<Dog> Dogs { get; }
  6. queries var artu = realm.Find<Dog>(6); IQueryable<Dog> puppies = realm.All<Dog>() .Where(d

    => d.Age < 2); var mila = realm.All<Dog>() .FirstOrDefault(d => d.Name == "Mila"); https://realm.io/docs/dotnet/latest/api/linqsupport.html
  7. notifications realm.RealmChanged += (s, e) => { //do something }

    var subscription = realm.All<Dog>() .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 }
  8. transactions 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; });
  9. autenticazionee sync configuration 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);