如何查询String AND NSDate属性?

时间:2016-07-17 11:03:26

标签: ios swift realm

我的代码面临一个奇怪的错误:

if let date = self.messages.last?.date {
    let newMessages = self.realm.objects(Message).filter("chatId == '\(self.chatId!)' AND date > \(date)")
}

这会输出错误:

  

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'无法解析格式字符串'chatId ='oSgUGWH9fWURmBh5NQZK2POpxdI3yEdl7PrPzAU33l7cVFIpzR38otF3'和日期> 2016-07-17 10:56:07 +0000“'

我做错了什么?

修改

使用NSPredicate可行:

let predicate = NSPredicate(format: "chatId = %@ AND date > %@", self.chatId!, date)
newMessages = self.realm.objects(Message).filter(predicate)

但为什么第一种解决方案不起作用?

1 个答案:

答案 0 :(得分:0)

如果要使用谓词过滤数组,则需要传递谓词而不仅仅是字符串文字作为参数,并使用方法filteredArrayUsingPredicate(_:)

为什么"chatId == '\(self.chatId!)' AND date > \(date)"不起作用的是编译器将其解释为字符串文字 - 而不是您在其他示例中创建的谓词:

NSPredicate(format: "chatId = %@ AND date > %@", self.chatId!, date)

修复方法是在您的编辑中完成NSPredicate实例化,并将该值传递给filteredArrayUsingPredicate(:_),或者只是将实例移动到方法内部:

newMessages = self.realm.objects(Message).filteredArrayUsingPredicate(NSPredicate(format: "chatId = %@ AND date > %@", self.chatId!, date))

如果你想使用这个方法,那么数组必须是NSArray,并且数组中的对象需要符合KVC,所以你在使用{{{ 1}}方法如下:

filter(_:)