安装包 io.realm

接口 OrderedRealmCollection<E>

  • 所有超级接口:
    Collection<E>, io.realm.internal.Freezable<RealmCollection<E>> , Iterable<E> , List<E> , io.realm.internal.ManageableObject , RealmCollection<E>
    所有已知的实现类:
    OrderedRealmCollectionSnapshot, RealmList , RealmResults

    public interface OrderedRealmCollection<E>
    extends List<E>, RealmCollection<E>
    OrderedRealmCollection是一个维护其元素顺序的集合。 OrderedRealmCollection中的每个元素都有一个索引。 因此,每个元素都可以通过其索引进行访问,第一个索引为零。 通常, OrderedRealmCollection允许重复元素,而集合的元素必须是唯一的。

    OrderedRealmCollection分为三种类型。 RealmResultsRealmList是实时collection。它们始终是最新的,并且永远不会包含无效的RealmObjectOrderedRealmCollectionSnapshot则不同。 An OrderedRealmCollectionSnapshot can be created from another OrderedRealmCollection. 其大小和元素顺序与创建原始集合时相同。 如果对象被删除, OrderedRealmCollectionSnapshot可能包含无效的RealmObject

    使用迭代器对OrderedRealmCollection进行迭代始终有效。 您可以删除或修改元素,而不会影响迭代器。 请参阅以下示例:

     
     RealmResults<Dog> dogs = realm.where(Dog.class).findAll();
     int s = dogs.size(); // 10
     realm.beginTransaction();
     for (Dog dog : dogs) {
         dog.deleteFromRealm();
         s = dogs.size(); // This will be decreased by 1 every time after a dog is removed.
     }
     realm.commitTransaction();
     s = dogs.size(); // 0
     
     

    从实时collection创建的迭代器将在创建迭代器时创建稳定视图,允许您在迭代时删除和修改元素,而不会影响迭代器。但是,支持迭代器的RealmResults仍会实时更新,这意味着元素的大小和顺序可能会在迭代时发生变化。 RealmListRealmResults具有相同的行为,因为它们都是实时collection。

    简单的 for 循环则不同。 请参阅以下示例:

     
     RealmResults<Dog> dogs = realm.where(Dog.class).findAll();
     realm.beginTransaction();
     for (int i = 0; i < dogs.size(); i++) {
         dogs.get(i).deleteFromRealm();
     }
     realm.commitTransaction();
     s = dogs.size(); // 5
     
     

    上面的示例只删除了RealmResults中的一半元素。 这是因为每个循环dogs.size()都会减少 1。 循环中发生的删除操作将立即影响RealmResults的大小。 要解决此问题,您可以从OrderedRealmCollectionSnapshot RealmResultsRealmList或 创建一个 ,并对其执行简单的 for 循环:

     
     RealmResults<Dog> dogs = realm.where(Dog.class).findAll();
     OrderedRealmCollectionSnapshot snapshot = dogs.createSnapshot();
     // dogs.size() == 10 && snapshot.size() == 10
     realm.beginTransaction();
     for (int i = 0; i < snapshot.size(); i++) {
         snapshot.get(0).deleteFromRealm();
         // snapshot.get(0).isValid() == false
     }
     realm.commitTransaction();
     // dogs.size() == 0 && snapshot.size() == 10
     
     

    可以看到,删除后,快照的大小和元素顺序与删除前相同。但该位置的元素将变为无效。

    • 方法详细信息

      • first

        @Nullable
        E first​( @Nullable E defaultValue)
        获取集合中的第一个对象。 如果collection为空,将使用提供的默认。
        返回:
        第一个对象或提供的默认值。
      • last

        @Nullable
        E last​( @Nullable E defaultValue)
        从collection中获取最后一个对象。如果collection为空,将使用提供的默认。
        返回:
        最后一个对象或提供的默认值。
      • sort

        RealmResults < E > sort​( String fieldName)
        根据提供的字段以升序对collection进行排序。
        参数:
        fieldName - 作为排序依据的字段名称。 仅支持 boolean、short、int、long、float、double、Date 和 String 类型的字段。
        返回:
        将创建并返回一个新的已排序RealmResults 。 原始collection保持不变。
        抛出异常:
        IllegalArgumentException - 如果字段名称不存在或其类型无效。
        IllegalStateException - 如果 Realm 已关闭、在错误的线程上调用或者collection是非托管collection。
      • sort

        RealmResults < E > sort​( String fieldName, Sort sortOrder)
        根据提供的字段和排序顺序对collection进行排序。
        参数:
        fieldName - 作为排序依据的字段名称。 仅支持 boolean、short、int、long、float、double、Date 和 String 类型的字段。
        sortOrder - 排序依据的方向。
        返回:
        将创建并返回一个新的已排序RealmResults 。 原始collection保持不变。
        抛出异常:
        IllegalArgumentException - 如果字段名称不存在或类型无效。
        IllegalStateException - 如果 Realm 已关闭、在错误的线程上调用或者collection是非托管collection。
      • sort

        RealmResults < E > sort​( String fieldName1, Sort sortOrder1, String fieldName2, Sort sortOrder2)
        根据提供的字段和排序顺序对collection进行排序。
        参数:
        fieldName1 - 第一个字段名称。 仅支持 boolean、short、int、long、float、double、Date 和 String 类型的字段。
        sortOrder1 — 第一个字段的排序顺序。
        fieldName2 — 第二个字段名称。 仅支持 boolean、short、int、long、float、double、Date 和 String 类型的字段。
        sortOrder2 — 第二个字段的排序顺序。
        返回:
        将创建并返回一个新的已排序RealmResults 。 原始collection保持不变。
        抛出异常:
        IllegalArgumentException - 如果字段名不存在或类型无效。
        IllegalStateException - 如果 Realm 已关闭、在错误的线程上调用或者collection是非托管collection。
      • sort

        RealmResults < E > sort​( String [] fieldNames, Sort [] sortOrders)
        根据提供的字段和排序顺序对collection进行排序。
        参数:
        fieldNames - 作为排序依据的字段名称数组。 仅支持 boolean、short、int、long、float、double、Date 和 String 类型的字段。
        sortOrders - 排序依据的方向。
        返回:
        将创建并返回一个新的已排序RealmResults 。 原始collection保持不变。
        抛出异常:
        IllegalArgumentException - 如果字段名不存在或类型无效。
        IllegalStateException - 如果 Realm 已关闭、在错误的线程上调用或者collection是非托管collection。
      • deleteFromRealm

        void deleteFromRealm​(int 位置)
        从 Realm 中删除给定索引处的对象。 这也会将其从collection中删除。
        参数:
        location - 标识要删除的对象的数组索引。
        抛出异常:
        IndexOutOfBoundsException - 如果location < 0 || location >= size()
        IllegalStateException - 如果 Realm 已关闭或从错误的线程调用该方法。
        UnsupportedOperationException - 如果集合为非托管。
      • deleteFirstFromRealm

        boolean deleteFirstFromRealm()
        从 Realm 中删除第一个对象。 这也会将其从该collection中删除。
        返回:
        true 如果删除了对象,则为false
        抛出异常:
        IllegalStateException - 如果 Realm 已关闭或在错误的线程上调用了该方法。
        UnsupportedOperationException - 如果集合为非托管。
      • deleteLastFromRealm

        boolean deleteLastFromRealm()
        从 Realm 中删除最后一个对象。 这也会将其从该collection中删除。
        返回:
        true 如果删除了对象,则为false
        抛出异常:
        IllegalStateException - 如果 Realm 已关闭或从错误的线程调用该方法。
        UnsupportedOperationException - 如果集合为非托管。