Mic*_*mhr 4 predicate realm swift2
我在Swift2中编写了一个(Mac)应用程序,它应该搜索具有特定主题的教师的Realm数据库.领域中教师对象的定义如下所示:
class Teacher: Object {
var subjects = List<Subject>()
}
Run Code Online (Sandbox Code Playgroud)
这个类非常复杂所以我删除了一些行...
这里的函数应该过滤具有特定主题的教师数据库,并仅返回教师姓名(如String Array :) [String]:
func getAllTeacherNamesForSubject(subject: String) -> [String] {
// Open Database
let realm = openRealmDatabase()
// Or open it this way:
// RLMRealm.setDefaultRealmPath("/Users/name/Data.realm")
// var realm: Realm!
// realm = try! Realm()
// filter the Database with Predicate
let objects = realm.objects(Teacher).filter("!!! Need Help !!!", subject)
// How can I filter the Database? I want to get all the Teachers for that subject
// Make an Array of Objects
let objectsArray = objects.toArray(Teacher) as [Teacher]
// Return
return ???
}
// This is the toArray extension.
// You may need it to use the snippet above
extension Results {
func toArray<T>(ofType: T.Type) -> [T] {
var array = [T]()
for var i = 0; i < count; i++ {
if let result = self[i] as? T {
array.append(result)
}
}
return array
}
}
Run Code Online (Sandbox Code Playgroud)
所以问题是我不知道如何过滤数据库.
有谁可以帮助我吗?
要过滤与特定值有关系的对象,或者在您的情况下,具有特定名称的主题的教师,您可以将此谓词用于不区分大小写的搜索:
NSPredicate(format: "ANY subjects.name ==[c] %@", subjectName)
Run Code Online (Sandbox Code Playgroud)
并将其插入过滤功能.由于您只想返回教师姓名,因此您不需要按照建议创建任何扩展名,而是使用本机swift map方法:
func getAllTeacherNamesForSubject(subjectName: String) -> [String] {
let realm = openRealmDatabase
let predicate = NSPredicate(format: "ANY subjects.name ==[c] %@", subjectName)
return realm.objects(Teacher).filter(predicate).map { $0.name }
}
Run Code Online (Sandbox Code Playgroud)
作为参考,您可以在Realm的网站上找到一个很好的备忘单,描述支持的谓词语法的完整列表.