2015-09-27 108 views
4

我tryig使用此查询如何获得最大ID的项目?

realm.objects(Entity).filter("@max.id").first 

它抛出一个错误,说这样看来,这不是做了正确的方式,无法解析查询来获取与最大id项目。

如何在Swarm上的Realm上编写此查询?

回答

8

过滤器本身并不能完成你以后的工作,因为他们一次只考虑一个顶级对象。

除此之外概念问题,还有与你发布的代码的几个问题:

  1. @"@max.id"不是有效NSPredicate format stringNSPredicate格式字符串必须由表达式之间的比较组成,而不是表达式本身。

  2. 集合运营商(如@max)必须应用于集合。在你的例子中,它被应用于Entity。由于Entity不是集合,所以谓词无效。尽管如此,将集合运算符应用于List属性Entity上也是有效的。

类似下面应该做你以后:我使用的Xcode 8.0和3.0雨燕

let entities = realm.objects(Entity) 
let id = entities.max("id") as Int? 
let entity = id != nil ? entities.filter("id == %@", id!).first : nil 
+0

真棒回答,谢谢!我想知道如果从数据库加载所有元素(如果存在相当多的数字),是否会出现严重的性能损失,只是为了找到最大的ID – StackOverflower

+0

领域的查询是懒惰的,所以只有一个'Entity'对象会被这种方法加载。 – bdash

+0

我实际上在尝试你的代码时遇到了这个错误(对不起,我直到现在还不能测试它,但看起来非常稳固)。无法推断泛型参数'U'的参数。它似乎与'max'方法有关 – StackOverflower

2

我继工作:

let allEntries = realm.objects(Model.self) 
if allEntries.count > 0 { 
    let lastId = allEntries.max(ofProperty: "id") as Int? 
    return lastId! + 1 
} else { 
    return 1 
}