结果集合
Realm collection表示查询操作的延迟计算结果。因此,collection包含零个或多个单一Realm 实例的实例。
重要
结果不可变:您无法在结果collection上添加或删除元素。这是因为结果集合的内容是由对数据库的查询确定的。
您可以使用 Realm 的查询引擎对任意集合进行筛选和排序。集合为实时对象,因此它们始终会反映当前线程上 Realm 实例的当前状态。此外,还可通过订阅集合通知来侦听集合中的更改。
结果为延迟计算出的结果
Realm 仅在您实际请求该查询的结果时才会运行查询,例如通过访问结果集合的元素。此延迟求值机制可让您编写优雅、高性能的代码来处理大型数据集和复杂查询。
使用collection
集合的实时性
与活动对象一样,Realm 集合通常也为实时集合:
实时结果集合始终会反映关联查询的当前结果。
实时列表始终会反映 Realm 实例上关系的当前状态。
但是,集合在两种情况下会处于非实时状态:
该collection为非托管集合。例如,尚未添加到 Realm 或已从 Realm 复制的 Realm 对象的集合属性。
集合已被冻结。
与集合通知相结合时,实时集合可实现简洁的响应式代码。例如,假设您的视图会显示查询结果。您可在视图类中保留对结果集合的引用,然后按需读取结果集合,而不必刷新该集合或验证其是否处于最新状态。
重要
索引可能会更改
由于结果会自动更新自身,因此请勿存储集合中对象的位置索引或集合中对象的数量。存储的索引或数量值在您使用时可能已过期。
以下示例展示了如何通过多种方式查询collection:
var plants = realm.All<Plant>(); // Use the Where operator to find items // in the results collection var pricklyPear = plants .Where(plant => plant.Name == "Prickly Pear"); // Or apply a filter to the results collection var pricklyPears = plants .Filter("Name == 'Prickly Pear'"); // You can query collection properties in the same way var morePlants = realm.All<Inventory>().ElementAt(0).Plants; // Convert the Ilist<Plant> to an IQueryable and // use the Where operator var pricklyPearCacti = morePlants.AsQueryable() .Where(plant => plant.Name == "Prickly Pear"); // Or apply a filter to the collection var greenPlants = realm.All<Inventory>() .Filter("Plants.Color CONTAINS[c] 'Green'");
限制查询结果
由于出现延迟求值,因此无需任何特殊机制来限制 Realm 的查询结果。例如,如果您的查询匹配到数千个对象,但您只想加载前十个对象,则只需访问结果集合的前十个元素即可。
分页
借助延迟求值,分页的常见任务变得非常简单。例如,假设您有一个与某一查询关联的结果集合,而该查询可与您 Realm 中的数千个对象匹配。您选择每页显示一百个对象。要前进到任一页面,只需从与目标页面相对应的索引开始访问结果集合中的元素即可。