Novidade na versão 10.6.0.
Você pode utilizar o tipo de dadosRealmSet do para gerenciar uma coleção de chaves únicas. RealmSet implementa a interface Set do Java, portanto, funciona como a classe HashSet incorporada, exceto pelo fato de que as instâncias RealmSet gerenciadas persistem seu conteúdo em um Realm. As instâncias RealmSet que contêm objetos de Realm , na verdade, armazenam apenas referências a esses objetos, portanto, a exclusão de um Objeto de Realm de um Realm também exclui esse objeto de quaisquer instâncias RealmSet que contenham o objeto.
Como o RealmSet implementa RealmCollection, ele tem alguns métodos matemáticos úteis, como sum, min e max. Para obter uma lista completa dos métodos RealmSet disponíveis, consulte: a referência da API RealmSet.
Limitações do método
Você não pode usar os seguintes métodos Realm em objetos que contêm um campo do tipo RealmSet:
Realm.insert()Realm.insertOrUpdate()Realm.createAllFromJson()Realm.createObjectFromJson()Realm.createOrUpdateAllFromJson()Realm.createOrUpdateObjectFromJson()
Uso
Para criar um campo do tipo RealmSet, defina uma propriedade de objeto do tipo RealmSet<E>, onde E define as chaves que você deseja armazenar em seu RealmSet.
Adicione um objeto a um
RealmSetcom RealmSet.add()Adicionar vários objetos com RealmSet.addAll()
Verifique se o conjunto contém um objeto específico com RealmSet.contains()
Verifique se o conjunto contém todos os vários objetos com RealmSet.containsAll()
import io.realm.RealmObject; import io.realm.RealmSet; public class Frog extends RealmObject { String name; RealmSet<Snack> favoriteSnacks; // realm-required empty constructor public Frog() {} public String getName() { return name; } public void setName(String name) { this.name = name; } public RealmSet<Snack> getFavoriteSnacks() { return favoriteSnacks; } public void setFavoriteSnacks(RealmSet<Snack> favoriteSnacks) { this.favoriteSnacks = favoriteSnacks; } }
import io.realm.RealmObject; public class Snack extends RealmObject { private String name; public Snack() {} public String getName() { return name; } public void setName(String name) { this.name = name; } }
Frog frog = realm.createObject(Frog.class); frog.setName("George Washington"); // get the RealmSet field from the object we just created RealmSet<Snack> set = frog.getFavoriteSnacks(); // add value to the RealmSet Snack flies = realm.createObject(Snack.class); flies.setName("flies"); set.add(flies); // add multiple values to the RealmSet Snack water = realm.createObject(Snack.class); water.setName("water"); Snack verySmallRocks = realm.createObject(Snack.class); verySmallRocks.setName("verySmallRocks"); set.addAll(Arrays.asList(water, verySmallRocks)); // check for the presence of a key with contains Assert.assertTrue(set.contains(flies)); // check for the presence of multiple keys with containsAll Snack biscuits = realm.createObject(Snack.class); biscuits.setName("biscuits"); Assert.assertTrue(set.containsAll(Arrays.asList(water, biscuits)) == false); // remove string from a set set.remove(verySmallRocks); // set no longer contains that string Assert.assertTrue(set.contains(verySmallRocks) == false); // deleting a Realm object also removes it from any RealmSets int sizeOfSetBeforeDelete = set.size(); flies.deleteFromRealm(); // deleting flies object reduced the size of the set by one Assert.assertTrue(sizeOfSetBeforeDelete == set.size() + 1);
import io.realm.RealmObject import io.realm.RealmSet open class Frog : RealmObject() { var name: String = "" var favoriteSnacks: RealmSet<Snack> = RealmSet<Snack>(); }
import io.realm.RealmObject open class Snack : RealmObject() { var name: String? = null }
val frog = realm.createObject(Frog::class.java) frog.name = "Jonathan Livingston Applesauce" // get the RealmSet field from the object we just created val set = frog.favoriteSnacks // add value to the RealmSet val flies = realm.createObject(Snack::class.java) flies.name = "flies" set.add(flies) // add multiple values to the RealmSet val water = realm.createObject(Snack::class.java) water.name = "water" val verySmallRocks = realm.createObject(Snack::class.java) verySmallRocks.name = "verySmallRocks" set.addAll(listOf(water, verySmallRocks)) // check for the presence of a key with contains Assert.assertTrue(set.contains(flies)) // check for the presence of multiple keys with containsAll val biscuits = realm.createObject(Snack::class.java) biscuits.name = "biscuits" Assert.assertTrue(set.containsAll(Arrays.asList(water, biscuits)) == false) // remove string from a set set.remove(verySmallRocks) // set no longer contains that string Assert.assertTrue(set.contains(verySmallRocks) == false) // deleting a Realm object also removes it from any RealmSets val sizeOfSetBeforeDelete = set.size flies.deleteFromRealm() // deleting flies object reduced the size of the set by one Assert.assertTrue(sizeOfSetBeforeDelete == set.size + 1)
Notificações
Para assinar as alterações em um RealmSet, passe uma implementação SetChangeListener para o RealmSet.addChangeListener método. Sua implementação SetChangeListener deve definir um método onChange() , que aceita uma referência ao RealmSet alterado e um conjunto de alterações como parâmetros. Você pode acessar o número de itens adicionados ao conjunto, bem como o número de itens removidos do conjunto por meio do parâmetro SetChangeSet .
AtomicReference<Frog> frog = new AtomicReference<Frog>(); realm.executeTransaction(r -> { frog.set(realm.createObject(Frog.class)); frog.get().setName("Jonathan Livingston Applesauce"); }); SetChangeListener<Snack> setChangeListener = new SetChangeListener<Snack>() { public void onChange( RealmSet<Snack> set, SetChangeSet changes) { Log.v("EXAMPLE", "Set changed: " + changes.getNumberOfInsertions() + " new items, " + changes.getNumberOfDeletions() + " items removed."); } }; frog.get().getFavoriteSnacks().addChangeListener(setChangeListener); realm.executeTransaction(r -> { // get the RealmSet field from the object we just created RealmSet<Snack> set = frog.get().getFavoriteSnacks(); // add value to the RealmSet Snack flies = realm.createObject(Snack.class); flies.setName("flies"); set.add(flies); // add multiple values to the RealmSet Snack water = realm.createObject(Snack.class); water.setName("water"); Snack verySmallRocks = realm.createObject(Snack.class); verySmallRocks.setName("verySmallRocks"); set.addAll(Arrays.asList(water, verySmallRocks)); });
var frog :Frog? = null realm.executeTransaction { r: Realm? -> frog = realm.createObject(Frog::class.java) frog?.name = "Jonathan Livingston Applesauce" } val setChangeListener: SetChangeListener<Snack> = SetChangeListener<Snack> { set, changes -> Log.v("EXAMPLE", "Set changed: " + changes.numberOfInsertions + " new items, " + changes.numberOfDeletions + " items removed.") } frog?.favoriteSnacks?.addChangeListener(setChangeListener) realm.executeTransaction { r: Realm? -> // get the RealmSet field from the object we just created val set = frog!!.favoriteSnacks // add value to the RealmSet val flies = realm.createObject(Snack::class.java) flies.name = "flies" set.add(flies) // add multiple values to the RealmSet val water = realm.createObject(Snack::class.java) water.name = "water" val verySmallRocks = realm.createObject(Snack::class.java) verySmallRocks.name = "verySmallRocks" set.addAll(Arrays.asList(water, verySmallRocks)) }