版本 10.6.0 中的新增内容。
您可以使用 RealmSet数据类型来管理唯一键的集合。 RealmSet实现了 Java 的Set接口,因此它的工作方式与内置HashSet类相同,不同之处在于托管RealmSet实例将其内容持久保存到域中。 包含Realm对象的RealmSet实例实际上仅存储对这些对象的引用,因此从域中删除Realm 对象也会从包含该对象的任何RealmSet实例中删除该对象。
由于RealmSet实现了RealmCollection ,因此它具有一些有用的数学方法,例如sum 、 min和max 。 有关可用RealmSet方法的完整列表,请参阅: RealmSet API 参考。
方法限制
不能对包含RealmSet类型字段的对象使用以下Realm方法:
Realm.insert()Realm.insertOrUpdate()Realm.createAllFromJson()Realm.createObjectFromJson()Realm.createOrUpdateAllFromJson()Realm.createOrUpdateObjectFromJson()
使用
要创建RealmSet 类型的字段,请定义对象类型的属性,其中RealmSet<E> E定义要存储在RealmSet 中的键。
使用RealmSet.add()将对象添加到
RealmSet使用RealmSet.addAll()添加多个对象
使用RealmSet.contains()检查集合中是否包含特定对象
使用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)
通知
要订阅对RealmSet的更改,请将SetChangeListener实现传递给RealmSet.addChangeListener 方法。 您的SetChangeListener实现必须定义一个onChange()方法,该方法接受对已更改RealmSet的引用和一组更改作为参数。 您可以通过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)) }