Visão geral
O Realm oferece RealmInteger como um tipo inteiro especial que você pode usar como contador lógico. RealmInteger<T> expõe uma API adicional que pode Express a intenção com mais clareza e gerar melhores etapas de resolução de conflitos ao usar os Realms sincronizados. O argumento de tipo <T> pode ser do tipo byte, short, int ou long. O exemplo seguinte mostra como utilizar uma propriedade RealmInteger que mapeia para um int:
public partial class MyRealmClass : IRealmObject { [] public int _id { get; set; } public RealmInteger<int> Counter { get; set; } }
Implementação de um contador
Tradicionalmente, você implementaria um contador lendo um valor, incrementando-o e, em seguida, definindo-o (myObject.Counter += 1). Isso não funciona bem em uma situação assíncrona, como quando dois clientes estão offline. Considere o seguinte cenário:
O Objeto de Realm tem uma propriedade
counterdo tipoint. Atualmente, está definido para um valor de10.Os clientes 1 e 2 leem a propriedade
counter(10) e cada um incrementa o valor em1.Quando cada cliente recupera a conectividade e mescla suas alterações, eles esperam um valor de 11 e não há conflito. No entanto, o valor do contador deve ser
12!
No entanto, ao usar um RealmInteger, você pode chamar os métodos Increment() e Decrement() e, para redefinir o contador, defina-o como 0, da mesma forma que faria com um int:
var myObject = realm.Find<MyRealmClass>(id); // myObject.Counter == 0 realm.Write(() => { // Increment the value of the RealmInteger myObject.Counter.Increment(); // 1 myObject.Counter.Increment(5); // 6 // Decrement the value of the RealmInteger // Note the use of Increment with a negative number myObject.Counter.Decrement(); // 5 myObject.Counter.Increment(-3); // 2 // Reset the RealmInteger myObject.Counter = 0; // RealmInteger<T> is implicitly convertable to T: int bar = myObject.Counter; });
Importante
Ao redefinir um RealmInteger, você pode encontrar o problema de mesclagem offline descrito acima.
Um RealmInteger é apoiado pelo tipo integer tradicional, portanto, não é necessária nenhuma migração de esquema ao alterar um tipo de propriedade de T para RealmInteger<T>.