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

October 25, 2018
Tweet

More Decks by Andrea Ceroni

Other Decks in Programming

Transcript

  1. Go reactive with Realm and Xamarin Forms Andrea Ceroni [email protected]

    @andrekiba6 Sponsored by 25 ottobre 2018 Relatore
  2. 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)
  3. 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)
  4. 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
  5. 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
  6. 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; } objects
  7. 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 queries
  8. 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 } notifications
  9. 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
  10. 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