Package io.realm

Class RealmList<E>

  • Type Parameters:
    E - the class of objects in list.
    All Implemented Interfaces:
    io.realm.internal.Freezable<RealmCollection<E>>, io.realm.internal.ManageableObject, OrderedRealmCollection<E>, RealmCollection<E>, Iterable<E>, Collection<E>, List<E>

    public class RealmList<E>
    extends AbstractList<E>
    implements OrderedRealmCollection<E>
    RealmList is used to model one-to-many relationships in a RealmObject. RealmList has two modes: A managed and unmanaged mode. In managed mode all objects are persisted inside a Realm, in unmanaged mode it works as a normal ArrayList.

    Only Realm can create managed RealmLists. Managed RealmLists will automatically update the content whenever the underlying Realm is updated, and can only be accessed using the getter of a RealmObject.

    Unmanaged RealmLists can be created by the user and can contain both managed and unmanaged RealmObjects. This is useful when dealing with JSON deserializers like GSON or other frameworks that inject values into a class. Unmanaged elements in this list can be added to a Realm using the Realm.copyToRealm(Iterable, ImportFlag...) method.

    RealmList can contain more elements than Integer.MAX_VALUE. In that case, you can access only first Integer.MAX_VALUE elements in it.

    • Field Detail

      • baseRealm

        public final io.realm.BaseRealm baseRealm
        The BaseRealm instance in which this list resides.

        Warning: This field is only exposed for internal usage, and should not be used.

    • Constructor Detail

      • RealmList

        public RealmList()
        Creates a RealmList in unmanaged mode, where the elements are not controlled by a Realm. This effectively makes the RealmList function as a ArrayList and it is not possible to query the objects in this state.

        Use Realm.copyToRealm(Iterable, ImportFlag...) to properly persist its elements in Realm.

      • RealmList

        public RealmList​(E... objects)
        Creates a RealmList in unmanaged mode with an initial list of elements. A RealmList in unmanaged mode function as a ArrayList and it is not possible to query the objects in this state.

        Use Realm.copyToRealm(Iterable, ImportFlag...) to properly persist all unmanaged elements in Realm.

        Parameters:
        objects - initial objects in the list.
    • Method Detail

      • isValid

        public boolean isValid()
        Checks if the collection is still valid to use, i.e., the Realm instance hasn't been closed. It will always return true for an unmanaged collection.
        Specified by:
        isValid in interface io.realm.internal.ManageableObject
        Specified by:
        isValid in interface RealmCollection<E>
        Returns:
        true if it is still valid to use or an unmanaged collection, false otherwise.
      • freeze

        public RealmList<E> freeze()
        Specified by:
        freeze in interface io.realm.internal.Freezable<E>
      • isFrozen

        public boolean isFrozen()
        Specified by:
        isFrozen in interface io.realm.internal.ManageableObject
      • isManaged

        public boolean isManaged()
        Checks if the collection is managed by Realm. A managed collection is just a wrapper around the data in the underlying Realm file. On Looper threads, a managed collection will be live-updated so it always points to the latest data. Managed collections are thread confined so that they cannot be accessed from other threads than the one that created them.

        If this method returns false, the collection is unmanaged. An unmanaged collection is just a normal java collection, so it will not be live updated.

        Specified by:
        isManaged in interface io.realm.internal.ManageableObject
        Specified by:
        isManaged in interface RealmCollection<E>
        Returns:
        true if this is a managed RealmCollection, false otherwise.
      • add

        public void add​(int location,
                        @Nullable
                        E element)
        Inserts the specified object into this List at the specified location. The object is inserted before any previous element at the specified location. If the location is equal to the size of this List, the object is added at the end.
        1. Unmanaged RealmLists: It is possible to add both managed and unmanaged objects. If adding managed objects to an unmanaged RealmList they will not be copied to the Realm again if using Realm.copyToRealm(RealmModel, ImportFlag...) afterwards.
        2. Managed RealmLists: It is possible to add unmanaged objects to a RealmList that is already managed. In that case the object will transparently be copied to Realm using Realm.copyToRealm(RealmModel, ImportFlag...) or Realm.copyToRealmOrUpdate(RealmModel, ImportFlag...) if it has a primary key.
        Specified by:
        add in interface List<E>
        Overrides:
        add in class AbstractList<E>
        Parameters:
        location - the index at which to insert.
        element - the element to add.
        Throws:
        IllegalStateException - if Realm instance has been closed or container object has been removed.
        IndexOutOfBoundsException - if location < 0 || location > size().
      • move

        public void move​(int oldPos,
                         int newPos)
        Moves an object from one position to another, while maintaining a fixed sized list. RealmObjects will be shifted so no null values are introduced.
        Parameters:
        oldPos - index of RealmObject to move.
        newPos - target position. If newPos < oldPos the object at the location will be shifted to the right. If oldPos < newPos, indexes > oldPos will be shifted once to the left.
        Throws:
        IllegalStateException - if Realm instance has been closed or parent object has been removed.
        IndexOutOfBoundsException - if any position is outside [0, size()].
      • remove

        public E remove​(int location)
        Removes the object at the specified location from this list.
        Specified by:
        remove in interface List<E>
        Overrides:
        remove in class AbstractList<E>
        Parameters:
        location - the index of the object to remove.
        Returns:
        the removed object.
        Throws:
        IllegalStateException - if Realm instance has been closed or parent object has been removed.
        IndexOutOfBoundsException - if location < 0 || location >= size().
      • remove

        public boolean remove​(@Nullable
                              Object object)
        Removes one instance of the specified object from this Collection if one is contained. This implementation iterates over this Collection and tests each element e returned by the iterator, whether e is equal to the given object. If object != null then this test is performed using object.equals(e), otherwise using object == null. If an element equal to the given object is found, then the remove method is called on the iterator and true is returned, false otherwise. If the iterator does not support removing elements, an UnsupportedOperationException is thrown.
        Specified by:
        remove in interface Collection<E>
        Specified by:
        remove in interface List<E>
        Overrides:
        remove in class AbstractCollection<E>
        Parameters:
        object - the object to remove.
        Returns:
        true if this Collection is modified, false otherwise.
        Throws:
        ClassCastException - if the object passed is not of the correct type.
        NullPointerException - if object is null.
      • removeAll

        public boolean removeAll​(Collection<?> collection)
        Removes all occurrences in this Collection of each object in the specified Collection. After this method returns none of the elements in the passed Collection can be found in this Collection anymore.

        This implementation iterates over the Collection and tests each element e returned by the iterator, whether it is contained in the specified Collection. If this test is positive, then the remove method is called on the iterator.

        Specified by:
        removeAll in interface Collection<E>
        Specified by:
        removeAll in interface List<E>
        Overrides:
        removeAll in class AbstractCollection<E>
        Parameters:
        collection - the collection of objects to remove.
        Returns:
        true if this Collection is modified, false otherwise.
        Throws:
        ClassCastException - if one or more elements of collection isn't of the correct type.
        NullPointerException - if collection is null.
      • deleteFirstFromRealm

        public boolean deleteFirstFromRealm()
        Deletes the first object from the Realm. This also removes it from this collection.
        Specified by:
        deleteFirstFromRealm in interface OrderedRealmCollection<E>
        Returns:
        true if an object was deleted, false otherwise.
      • deleteLastFromRealm

        public boolean deleteLastFromRealm()
        Deletes the last object from the Realm. This also removes it from this collection.
        Specified by:
        deleteLastFromRealm in interface OrderedRealmCollection<E>
        Returns:
        true if an object was deleted, false otherwise.
      • get

        @Nullable
        public E get​(int location)
        Returns the element at the specified location in this list.
        Specified by:
        get in interface List<E>
        Specified by:
        get in class AbstractList<E>
        Parameters:
        location - the index of the element to return.
        Returns:
        the element at the specified index.
        Throws:
        IllegalStateException - if Realm instance has been closed or parent object has been removed.
        IndexOutOfBoundsException - if location < 0 || location >= size().
      • first

        @Nullable
        public E first​(@Nullable
                       E defaultValue)
        Gets the first object from the collection. If the collection is empty, the provided default will be used instead.
        Specified by:
        first in interface OrderedRealmCollection<E>
        Returns:
        the first object or the provided default.
      • last

        @Nullable
        public E last​(@Nullable
                      E defaultValue)
        Gets the last object from the collection. If the collection is empty, the provided default will be used instead.
        Specified by:
        last in interface OrderedRealmCollection<E>
        Returns:
        the last object or the provided default.
      • sort

        public RealmResults<E> sort​(String fieldName)
        Sorts a collection based on the provided field in ascending order.
        Specified by:
        sort in interface OrderedRealmCollection<E>
        Parameters:
        fieldName - the field name to sort by. Only fields of type boolean, short, int, long, float, double, Date, and String are supported.
        Returns:
        a new sorted RealmResults will be created and returned. The original collection stays unchanged.
      • sort

        public RealmResults<E> sort​(String fieldName,
                                    Sort sortOrder)
        Sorts a collection based on the provided field and sort order.
        Specified by:
        sort in interface OrderedRealmCollection<E>
        Parameters:
        fieldName - the field name to sort by. Only fields of type boolean, short, int, long, float, double, Date, and String are supported.
        sortOrder - the direction to sort by.
        Returns:
        a new sorted RealmResults will be created and returned. The original collection stays unchanged.
      • sort

        public RealmResults<E> sort​(String fieldName1,
                                    Sort sortOrder1,
                                    String fieldName2,
                                    Sort sortOrder2)
        Sorts a collection based on the provided fields and sort orders.
        Specified by:
        sort in interface OrderedRealmCollection<E>
        Parameters:
        fieldName1 - first field name. Only fields of type boolean, short, int, long, float, double, Date, and String are supported.
        sortOrder1 - sort order for first field.
        fieldName2 - second field name. Only fields of type boolean, short, int, long, float, double, Date, and String are supported.
        sortOrder2 - sort order for second field.
        Returns:
        a new sorted RealmResults will be created and returned. The original collection stays unchanged.
      • sort

        public RealmResults<E> sort​(String[] fieldNames,
                                    Sort[] sortOrders)
        Sorts a collection based on the provided fields and sort orders.
        Specified by:
        sort in interface OrderedRealmCollection<E>
        Parameters:
        fieldNames - an array of field names to sort by. Only fields of type boolean, short, int, long, float, double, Date, and String are supported.
        sortOrders - the directions to sort by.
        Returns:
        a new sorted RealmResults will be created and returned. The original collection stays unchanged.
      • deleteFromRealm

        public void deleteFromRealm​(int location)
        Deletes the object at the given index from the Realm. This also removes it from the collection.
        Specified by:
        deleteFromRealm in interface OrderedRealmCollection<E>
        Parameters:
        location - the array index identifying the object to be removed.
      • size

        public int size()
        Returns the number of elements in this List.
        Specified by:
        size in interface Collection<E>
        Specified by:
        size in interface List<E>
        Specified by:
        size in class AbstractCollection<E>
        Returns:
        the number of elements in this List.
        Throws:
        IllegalStateException - if Realm instance has been closed or parent object has been removed.
      • where

        public RealmQuery<E> where()
        Returns a RealmQuery, which can be used to query for specific objects of this class.
        Specified by:
        where in interface RealmCollection<E>
        Returns:
        a RealmQuery object.
        Throws:
        IllegalStateException - if Realm instance has been closed or parent object has been removed.
        See Also:
        RealmQuery
      • min

        @Nullable
        public Number min​(String fieldName)
        Finds the minimum value of a field.
        Specified by:
        min in interface RealmCollection<E>
        Parameters:
        fieldName - the field to look for a minimum on. Only number fields are supported.
        Returns:
        if no objects exist or they all have null as the value for the given field, null will be returned. Otherwise the minimum value is returned. When determining the minimum value, objects with null values are ignored.
      • max

        @Nullable
        public Number max​(String fieldName)
        Finds the maximum value of a field.
        Specified by:
        max in interface RealmCollection<E>
        Parameters:
        fieldName - the field to look for a maximum on. Only number fields are supported.
        Returns:
        if no objects exist or they all have null as the value for the given field, null will be returned. Otherwise the maximum value is returned. When determining the maximum value, objects with null values are ignored.
      • sum

        public Number sum​(String fieldName)
        Calculates the sum of a given field.
        Specified by:
        sum in interface RealmCollection<E>
        Parameters:
        fieldName - the field to sum. Only number fields are supported.
        Returns:
        the sum. If no objects exist or they all have null as the value for the given field, 0 will be returned. When computing the sum, objects with null values are ignored.
      • average

        public double average​(String fieldName)
        Returns the average of a given field.
        Specified by:
        average in interface RealmCollection<E>
        Parameters:
        fieldName - the field to calculate average on. Only number fields are supported.
        Returns:
        the average for the given field amongst objects in query results. This will be of type double for all types of number fields. If no objects exist or they all have null as the value for the given field, 0 will be returned. When computing the average, objects with null values are ignored.
      • maxDate

        @Nullable
        public Date maxDate​(String fieldName)
        Finds the maximum date.
        Specified by:
        maxDate in interface RealmCollection<E>
        Parameters:
        fieldName - the field to look for the maximum date. If fieldName is not of Date type, an exception is thrown.
        Returns:
        if no objects exist or they all have null as the value for the given date field, null will be returned. Otherwise the maximum date is returned. When determining the maximum date, objects with null values are ignored.
      • minDate

        @Nullable
        public Date minDate​(String fieldName)
        Finds the minimum date.
        Specified by:
        minDate in interface RealmCollection<E>
        Parameters:
        fieldName - the field to look for the minimum date. If fieldName is not of Date type, an exception is thrown.
        Returns:
        if no objects exist or they all have null as the value for the given date field, null will be returned. Otherwise the minimum date is returned. When determining the minimum date, objects with null values are ignored.
      • deleteAllFromRealm

        public boolean deleteAllFromRealm()
        This deletes all objects in the collection from the underlying Realm as well as from the collection.
        Specified by:
        deleteAllFromRealm in interface RealmCollection<E>
        Returns:
        true if objects was deleted, false otherwise.
      • isLoaded

        public boolean isLoaded()
        Checks if a collection has finished loading its data yet.
        Specified by:
        isLoaded in interface RealmCollection<E>
        Returns:
        true if data has been loaded and is available, false if data is still being loaded.
      • load

        public boolean load()
        Blocks the collection until all data are available.
        Specified by:
        load in interface RealmCollection<E>
        Returns:
        true if the data could be successfully loaded, false otherwise.
      • contains

        public boolean contains​(@Nullable
                                Object object)
        Returns true if the list contains the specified element when attached to a Realm. This method will query the native Realm underlying storage engine to quickly find the specified element.

        If the list is not attached to a Realm, the default List.contains(Object) implementation will occur.

        Specified by:
        contains in interface Collection<E>
        Specified by:
        contains in interface List<E>
        Specified by:
        contains in interface RealmCollection<E>
        Overrides:
        contains in class AbstractCollection<E>
        Parameters:
        object - the element whose presence in this list is to be tested.
        Returns:
        true if this list contains the specified element otherwise false.
      • getRealm

        public Realm getRealm()
        Returns the Realm instance to which this collection belongs.

        Calling Closeable.close() on the returned instance is discouraged as it is the same as calling it on the original Realm instance which may cause the Realm to fully close invalidating the list.

        Returns:
        Realm instance this collection belongs to or null if the collection is unmanaged.
        Throws:
        IllegalStateException - if the Realm is an instance of DynamicRealm or the Realm was already closed.
      • asFlowable

        public Flowable<RealmList<E>> asFlowable()
        Returns an Rx Flowable that monitors changes to this RealmList. It will emit the current RealmList when subscribed to. RealmList will continually be emitted as the RealmList is updated - onComplete will never be called.

        Items emitted from Realm Flowables are frozen (See freeze(). This means that they are immutable and can be read on any thread.

        Realm Flowables always emit items from the thread holding the live RealmList. This means that if you need to do further processing, it is recommend to observe the values on a computation scheduler:

        list.asFlowable() .observeOn(Schedulers.computation()) .map(rxResults -> doExpensiveWork(rxResults)) .observeOn(AndroidSchedulers.mainThread()) .subscribe( ... );

        If you would like the asFlowable() to stop emitting items you can instruct RxJava to only emit only the first item by using the first() operator:

         
         list.asFlowable()
              .first()
              .subscribe( ... ) // You only get the results once
         
         

        Returns:
        RxJava Observable that only calls onNext. It will never call onComplete or OnError.
        Throws:
        UnsupportedOperationException - if the required RxJava framework is not on the classpath or the corresponding Realm instance doesn't support RxJava.
        See Also:
        RxJava and Realm
      • asChangesetObservable

        public Observable<CollectionChange<RealmList<E>>> asChangesetObservable()
        Returns an Rx Observable that monitors changes to this RealmList. It will emit the current RealmList when subscribed. For each update to the RealmList a pair consisting of the RealmList and the OrderedCollectionChangeSet will be sent. The changeset will be null the first time an RealmList is emitted.

        RealmList will continually be emitted as the RealmList is updated - onComplete will never be called.

        Items emitted from Realm Observables are frozen (See freeze(). This means that they are immutable and can be read on any thread.

        Realm Observables always emit items from the thread holding the live Realm. This means that if you need to do further processing, it is recommend to observe the values on a computation scheduler:

        list.asChangesetObservable() .observeOn(Schedulers.computation()) .map((rxList, changes) -> doExpensiveWork(rxList, changes)) .observeOn(AndroidSchedulers.mainThread()) .subscribe( ... );

        Returns:
        RxJava Observable that only calls onNext. It will never call onComplete or OnError.
        Throws:
        UnsupportedOperationException - if the required RxJava framework is not on the classpath or the corresponding Realm instance doesn't support RxJava.
        IllegalStateException - if the Realm wasn't opened on a Looper thread.
        See Also:
        RxJava and Realm
      • addChangeListener

        public void addChangeListener​(OrderedRealmCollectionChangeListener<RealmList<E>> listener)
        Adds a change listener to this RealmList.

        Registering a change listener will not prevent the underlying RealmList from being garbage collected. If the RealmList is garbage collected, the change listener will stop being triggered. To avoid this, keep a strong reference for as long as appropriate e.g. in a class variable.

         
         public class MyActivity extends Activity {
        
             private RealmList<Dog> dogs; // Strong reference to keep listeners alive
        
             \@Override
             protected void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
               dogs = realm.where(Person.class).findFirst().getDogs();
               dogs.addChangeListener(new OrderedRealmCollectionChangeListener<RealmList<Dog>>() {
                   \@Override
                   public void onChange(RealmList<Dog> dogs, OrderedCollectionChangeSet changeSet) {
                       // React to change
                   }
               });
             }
         }
         
         
        Parameters:
        listener - the change listener to be notified.
        Throws:
        IllegalArgumentException - if the change listener is null.
        IllegalStateException - if you try to add a listener from a non-Looper or IntentService thread.
      • addChangeListener

        public void addChangeListener​(RealmChangeListener<RealmList<E>> listener)
        Adds a change listener to this RealmList.

        Registering a change listener will not prevent the underlying RealmList from being garbage collected. If the RealmList is garbage collected, the change listener will stop being triggered. To avoid this, keep a strong reference for as long as appropriate e.g. in a class variable.

         
         public class MyActivity extends Activity {
        
             private RealmList<Dog> dogs; // Strong reference to keep listeners alive
        
             \@Override
             protected void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
               dogs = realm.where(Person.class).findFirst().getDogs();
               dogs.addChangeListener(new RealmChangeListener<RealmList<Dog>>() {
                   \@Override
                   public void onChange(RealmList<Dog> dogs) {
                       // React to change
                   }
               });
             }
         }
         
         
        Parameters:
        listener - the change listener to be notified.
        Throws:
        IllegalArgumentException - if the change listener is null.
        IllegalStateException - if you try to add a listener from a non-Looper or IntentService thread.
      • removeAllChangeListeners

        public void removeAllChangeListeners()
        Removes all user-defined change listeners.
        Throws:
        IllegalStateException - if you try to remove listeners from a non-Looper Thread.
        See Also:
        RealmChangeListener