Package io.objectbox.relation
Class ToMany<TARGET>
- java.lang.Object
-
- io.objectbox.relation.ToMany<TARGET>
-
- Type Parameters:
TARGET- Object type (entity).
- All Implemented Interfaces:
java.io.Serializable,java.lang.Iterable<TARGET>,java.util.Collection<TARGET>,java.util.List<TARGET>
public class ToMany<TARGET> extends java.lang.Object implements java.util.List<TARGET>, java.io.SerializableA List representing a to-many relation. It tracks changes (adds and removes) that can be later applied (persisted) to the database. This happens either onBox.put(Object)of the source entity of this relation or usingapplyChangesToDb().If this relation is a backlink from a
ToOnerelation, a DB sync will also update ToOne objects (but not vice versa).ToMany is thread-safe by default (only if the default
CopyOnWriteArrayListis used).- See Also:
- Serialized Form
-
-
Constructor Summary
Constructors Constructor Description ToMany(java.lang.Object sourceEntity, RelationInfo<?,TARGET> relationInfo)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidadd(int location, TARGET object)Seeadd(Object)for general comments.booleanadd(TARGET object)Adds the given entity to the list and tracks the addition so it can be later applied to the database (e.g.booleanaddAll(int index, java.util.Collection<? extends TARGET> objects)Seeadd(Object)for general comments.booleanaddAll(java.util.Collection<? extends TARGET> objects)Seeadd(Object)for general comments.voidapplyChangesToDb()Applies (persists) tracked changes (added and removed entities) to the target box and/or updates standalone relations.voidclear()booleancontains(java.lang.Object object)booleancontainsAll(java.util.Collection<?> collection)TARGETget(int location)intgetAddCount()TARGETgetById(long id)Gets an object by its entity ID.ListFactorygetListFactory()intgetRemoveCount()booleanhasA(QueryFilter<TARGET> filter)Returns true if at least one of the entities matches the given filter.booleanhasAll(QueryFilter<TARGET> filter)Returns true if all of the entities match the given filter.booleanhasPendingDbChanges()Returns true if there are pending changes for the DB.intindexOf(java.lang.Object object)intindexOfId(long id)Gets the index of the object with the given entity ID.voidinternalApplyToDb(io.objectbox.Cursor<?> sourceCursor, io.objectbox.Cursor<TARGET> targetCursor)For internal use only; do not use in your app.booleaninternalCheckApplyToDbRequired()For internal use only; do not use in your app.booleanisEmpty()booleanisResolved()java.util.Iterator<TARGET>iterator()intlastIndexOf(java.lang.Object object)java.util.ListIterator<TARGET>listIterator()java.util.ListIterator<TARGET>listIterator(int location)The returned iterator does not track any potential calls toIterator.remove().TARGETremove(int location)booleanremove(java.lang.Object object)booleanremoveAll(java.util.Collection<?> objects)TARGETremoveById(long id)Removes an object by its entity ID.voidreset()Resets the already loaded entities so they will be re-loaded on their next access.booleanretainAll(java.util.Collection<?> objects)TARGETset(int location, TARGET object)voidsetComparator(java.util.Comparator<TARGET> comparator)Set an comparator to define the order of entities.voidsetListFactory(ListFactory listFactory)Currently only used for non-persisted entities (id == 0).voidsetRemoveFromTargetBox(boolean removeFromTargetBox)On put, this also deletes removed entities from the target Box.intsize()voidsortById()Sorts the list by the "natural" ObjectBox order for to-many list (by entity ID).java.util.List<TARGET>subList(int start, int end)The returned sub list does not do any change tracking.java.lang.Object[]toArray()<T> T[]toArray(T[] array)
-
-
-
Constructor Detail
-
ToMany
public ToMany(java.lang.Object sourceEntity, RelationInfo<?,TARGET> relationInfo)
-
-
Method Detail
-
setListFactory
@Experimental public void setListFactory(ListFactory listFactory)
Currently only used for non-persisted entities (id == 0).
-
setComparator
@Experimental public void setComparator(java.util.Comparator<TARGET> comparator)
Set an comparator to define the order of entities.
-
setRemoveFromTargetBox
@Experimental public void setRemoveFromTargetBox(boolean removeFromTargetBox)
On put, this also deletes removed entities from the target Box. Note: removed target entities won't cascade the delete.
-
getListFactory
public ListFactory getListFactory()
-
add
public boolean add(TARGET object)
Adds the given entity to the list and tracks the addition so it can be later applied to the database (e.g. viaBox.put(Object)of the entity owning the ToMany, or viaapplyChangesToDb()). Note that the given entity will remain unchanged at this point (e.g. to-ones are not updated).
-
add
public void add(int location, TARGET object)Seeadd(Object)for general comments.- Specified by:
addin interfacejava.util.List<TARGET>
-
addAll
public boolean addAll(java.util.Collection<? extends TARGET> objects)
Seeadd(Object)for general comments.
-
addAll
public boolean addAll(int index, java.util.Collection<? extends TARGET> objects)Seeadd(Object)for general comments.- Specified by:
addAllin interfacejava.util.List<TARGET>
-
clear
public void clear()
-
contains
public boolean contains(java.lang.Object object)
-
containsAll
public boolean containsAll(java.util.Collection<?> collection)
-
get
public TARGET get(int location)
- Specified by:
getin interfacejava.util.List<TARGET>- Returns:
- An object for the given ID, or null if the object was already removed from its box (and was not cached before).
-
indexOf
public int indexOf(java.lang.Object object)
- Specified by:
indexOfin interfacejava.util.List<TARGET>
-
isEmpty
public boolean isEmpty()
-
iterator
@Nonnull public java.util.Iterator<TARGET> iterator()
-
lastIndexOf
public int lastIndexOf(java.lang.Object object)
- Specified by:
lastIndexOfin interfacejava.util.List<TARGET>
-
listIterator
@Nonnull public java.util.ListIterator<TARGET> listIterator()
- Specified by:
listIteratorin interfacejava.util.List<TARGET>
-
listIterator
@Nonnull public java.util.ListIterator<TARGET> listIterator(int location)
The returned iterator does not track any potential calls toIterator.remove(). Thus these removes will NOT be synced to the target Box.- Specified by:
listIteratorin interfacejava.util.List<TARGET>
-
remove
public boolean remove(java.lang.Object object)
-
removeById
public TARGET removeById(long id)
Removes an object by its entity ID.
-
removeAll
public boolean removeAll(java.util.Collection<?> objects)
-
retainAll
public boolean retainAll(java.util.Collection<?> objects)
-
set
public TARGET set(int location, TARGET object)
- Specified by:
setin interfacejava.util.List<TARGET>
-
size
public int size()
-
subList
@Nonnull public java.util.List<TARGET> subList(int start, int end)
The returned sub list does not do any change tracking. Thus any modifications to the sublist won't be synced to the target Box.- Specified by:
subListin interfacejava.util.List<TARGET>
-
toArray
@Nonnull public java.lang.Object[] toArray()
-
toArray
@Nonnull public <T> T[] toArray(T[] array)
-
reset
public void reset()
Resets the already loaded entities so they will be re-loaded on their next access. This allows to sync with non-tracked changes (outside of this ToMany object).
-
isResolved
public boolean isResolved()
-
getAddCount
public int getAddCount()
-
getRemoveCount
public int getRemoveCount()
-
sortById
public void sortById()
Sorts the list by the "natural" ObjectBox order for to-many list (by entity ID). This will be the order when you get the entities fresh (e.g. initially or after callingreset()). Note that non persisted entities (ID is zero) will be put to the end as they are still to get an ID.
-
applyChangesToDb
public void applyChangesToDb()
Applies (persists) tracked changes (added and removed entities) to the target box and/or updates standalone relations. Note that this is done automatically when you put the source entity of this to-many relation. However, if only this to-many relation has changed, it is more efficient to call this method.- Throws:
java.lang.IllegalStateException- If the source entity of this to-many relation was not previously persisted
-
hasA
@Beta public boolean hasA(QueryFilter<TARGET> filter)
Returns true if at least one of the entities matches the given filter.For use with
QueryBuilder.filter(QueryFilter)inside aQueryFilterto check to-many relation entities.
-
hasAll
@Beta public boolean hasAll(QueryFilter<TARGET> filter)
Returns true if all of the entities match the given filter. Returns false if the list is empty.For use with
QueryBuilder.filter(QueryFilter)inside aQueryFilterto check to-many relation entities.
-
getById
@Beta public TARGET getById(long id)
Gets an object by its entity ID.
-
indexOfId
@Beta public int indexOfId(long id)
Gets the index of the object with the given entity ID.
-
hasPendingDbChanges
public boolean hasPendingDbChanges()
Returns true if there are pending changes for the DB. Changes will be automatically persisted once the owning entity is put, or an explicit call toapplyChangesToDb()is made.
-
internalCheckApplyToDbRequired
@Internal public boolean internalCheckApplyToDbRequired()
For internal use only; do not use in your app. Called after relation source entity is put (so we have its ID). Prepares data forinternalApplyToDb(Cursor, Cursor)
-
internalApplyToDb
@Internal public void internalApplyToDb(io.objectbox.Cursor<?> sourceCursor, io.objectbox.Cursor<TARGET> targetCursor)For internal use only; do not use in your app. Convention:internalCheckApplyToDbRequired()must be called before this call as it prepares .
-
-