增删改都太简单了,这里不赘述了。详情可以看官方文档 1.简单查询
let result : Results<ProjectItp> = realm.objects(ProjectItp.self).filter("NSPredicate:xxxx") filter传入的参数是一个NSPredicate,可以上网了解一下这个NSPredicate 简单地举几个例子 [c] 表示忽略大小写,该符号可以用于==[c] !=[c] BEGINSWITH[c] CONTAINS[c] ENDSWITH[c] LIKE[c] //用AND 或者 && 连接都可以 filter("lastname == 'fancy' && l_id == 123456 && active == true") filter("lastname == 'fancy' AND l_id == 123456") // 字符串比较可以用以下类型 ==、!=、BEGINSWITH、CONTAINS 和 ENDSWITH filter("lastname CONTAINS 'fancy' ) //忽略大小写 filter("lastname CONTAINS[c] 'fancy' )
太多了,如果要看更详细的 参考官方文档-查询
接下来展示几个例子,在文档中仅是简单提及或者没有提及,且无任何示例代码的查询 2.结果集排序
// 对颜色为棕黄色、名字以 "B" 开头的狗狗进行排序 let sortedDogs = realm.objects(Dog.self).filter("color = 'tan' AND name BEGINSWITH 'B'").sorted(byKeyPath: "name") //对象属性 可以支持使用`.`符号链接到属性的属性,如果是List则不行 let ownersByDogAge = dogOwners.sorted(byKeyPath: "dog.age") //对多个属性按照优先级进行排序 let sortedDogs = realm.objects(Dog.self).sorted(by: [SortDescriptor(keyPath: "param1"),SortDescriptor(keyPath: "param2", ascending: true)])
3.去重
//可以传入多个属性, 示例中只传了一个属性 let result : Results<Dog> = realm.objects(Dog.self).filter("appUserId == \(currentUserId) && projectId == \(currentProjectId)").distinct(by: ["favoriteId"])
4.求和
var sumPercent : Int = realm.objects(Dog.self).filter("appUserId == \(currentUserId)").sum(ofProperty: "percentage")
5.查询数量
var count : Int = realm.objects(Dog.self).filter("appUserId == \(currentUserId)").count
6.相似查询
//对于 String 属性而言,LIKE 操作符可以用来比较左端属性和右端表达式:? 和 * 可用作通配符,其中 ? 可以匹配任意一个字符,* 匹配 0 个及其以上的字符。例如:value LIKE '?bc*' 可以匹配到诸如 “abcde” 和 “cbc” 之类的字符串; //以上文字 从文档中照搬 应该蛮好理解的吧
7.子查询SUBQUERY
//假设有如下数据模型 struct Student { var id = 0 var name = "" var score = 0 var courses : List<Course> = List<Course>() } struct Course { var cid = 0 var cname = "" //如高数1,高数2,大学英语1,大学物理1 } //查询任务如下:查询出所有学生中高数课数量>2的学生 realm.objects(Student.self).filter("SUBQUERY(courses, $course, $course.name contains '高数').@count > 2") //其中$course,这个是一个遍历时使用的变量名称,可以用任意变量名代替,相应的后面也要改 //如: realm.objects(Student.self).filter("SUBQUERY(courses, $c, $c.name contains '高数').@count > 2")
8.聚集表达式
//使用例7中的数据模型 //查询任务如下: 课程总数大于5的学生 realm.objects(Student.self).filter("courses.@count > 5") //其它的@min、@max、@sum 和 @avg我还没想到有什么用 //查询所有课程中编号最大值 > 100的学生 realm.objects(Student.self).filter("courses.@max.cid > 100") //如果要查询最大值 最小值 总数及平均值 应该使用如下代码: var max : Int? = result.max(ofProperty: "score") var min : Int? = result.min(ofProperty: "score") var sum : Int? = result.sum(ofProperty: "score") var average : Int? = result.average(ofProperty: "score")
9.关键字 ANY, ALL and NONE 以下摘自文档
//查找 所有朋友中有年龄小于14岁的人 let teens = realm.objects(Contact.self).filtered('ANY friends.age < 14'); //查找 所有朋友的年龄都大于21岁的人 let adults = realm.objects(Contact.self).filtered('ALL friends.age > 21');
10.其他
//查询owner叫bob的车 realm.objects(Car.self).filtered('owner.name ==[c] "bob"') //查询拥有至少一辆honda牌汽车的人 realm.objects(Person.self).filtered('cars.make ==[c] "honda"') //反向查询拥有至少一辆honda牌汽车的人 realm.objects(Person.self).filtered('@links.Car.owner.make ==[c] "honda"') //反向查询汽车均价3w以上的的人 realm.objects(Person.self).filtered('@links.Car.owner.@avg.price > 30000') //查询汽车等于3辆的人 realm.objects(Person.self).filtered('cars.@count == 3') //反向查询拥有至少一辆honda牌并且价格大于3w的汽车的人 realm.objects(Person.self).filtered('SUBQUERY(@links.Car.owner, $x, $x.make ==[c] "honda" && $x.price > 30000).@count > 1') //查找谁的汽车全都是honda牌的 realm.objects(Person.self).filtered('ALL @links.Car.owner.make ==[c] "honda"') //查找没有引入链接的人 realm.objects(Person.self).filtered('@links.@count == 0')