[Swift] Realm.io 资料库介绍 - 其之三:查询、排序、键结、自动更新、笔数

[前言]
第一篇的查询介绍只是小小的做了个全查询和部份条件查询。
事实上realm提供的条件不仅仅于此。
毕竟,我们不可能查资料是做全部查询。一定会有针对性的条件。
请注意,这边的範例是当你有把realm设成全域变数时才直接使用。
如果你没有设定成全域变数。那就一定要先下:
let realm = try! Realm()

[条件]
用法 : realm.objects(RLM_Entity).filter(条件)

let results = realm.objects(RLM_User.self).filter("age < 40")

这个做法就是找出年龄不满40岁的所有使用者资料。

搜寻条件的比较一共有以下几种:
==, <=, <, >=, >, !=, and BETWEEN
(注:但是和mysql一样的,其实你用一个「 = 」也会是比较相等值,而非程式结构的「赋值」)

搜寻字串比较的有以下几种(相当于mysql的like)
==, !=, BEGINSWITH, CONTAINS, and ENDSWITH
BEGINSWITH : 字串开头为……

//找出字串开头有Sa的所有使用者let results = realm.objects(RLM_User.self).filter("name BEGINSWITH 'Sa'")

ENDSWITH : 字串结尾为…

//找出字串结尾有am的所有使用者let results = realm.objects(RLM_User.self).filter("name ENDSWITH 'am'")

CONTAINS : 字串包含…

//找出字串包含a的所有使用者let results = realm.objects(RLM_User.self).filter("name CONTAINS 'a'")

条件式有以下几种:
AND, OR, and NOT

//找出字串包含a及年龄未满40岁的所有使用者let results = realm.objects(RLM_User.self).filter("age < 40 AND name CONTAINS 'a'")

[排序]
用法:
(1)realm.objects(RLM_Entity).sorted(byKeyPath: 栏位 )
此用法预设正排序
(2)realm.objects(RLM_Entity).sorted(byKeyPath: 栏位 , ascending: Bool )
此用法Bool为true时是正排序,false时为逆排序

//取出资料并将年龄由小排到大let results = realm.objects(RLM_User.self).sorted(byKeyPath: "age")//取出资料并将年龄由小大排到小let results = realm.objects(RLM_User.self).sorted(byKeyPath: "age", ascending: false)

关联排序:
(因为尚未讲到关联,这边仅先举例,等日后了解关联自然就明白用法)
以下是假设user上层有group管理,而要将group中取出的user依照年龄排序:

let results = realm.objects(RLM_Group.self).sorted(byKeyPath: "user.age")

(你要我怎么说?请记得:realm的关联很强大!很强大!很强大!(说三次))

[链接]
官方手册有讲到这个。
但其实他就是指像filter或是sorted是可以用连续键接来达成複式条件的。
这边我直接贴官方的範例:

let tanDogs = realm.objects(Dog.self).filter("color = 'tan'")let tanDogsWithBNames = tanDogs.filter("name BEGINSWITH 'B'")

这有什么好处?如果你需要不同的条件产生的各式结果,你不需要重複的使用realm.objects()
你可以用链接来继续往下取你要的资料。

[自动更新结果]
(又一个强大的东西出现了。)
什么是自动更新结果?
例如:

let results = ream.objects(RLM_User.self)print(results.count)let user = RLM_User()user.name = "eagle"user.age = "28"user.address = "No sheep"try! realm.write {    realm.add(user)}print(results.count)

这是新增一笔资料。
假设原本资料只有1笔,则上面的print(results.count)的结果就会是1。
之后执行了新增资料。
在其他的资料库系统,你可能需要重新取资料来取得更新后的结果。
但是realm完全不需要这样做。
上面的程式码第二次的print(results.count)会告诉你结果是2
而且里面的资料整个也都变动成新的状态了。
如此一来你可以省去重新载入资料的动作。

[笔数]
在别的资料库系统,我们会看到LIMIT这样的语法。
但是在realm的系统中不存在这样的东西。
事实上,realm的封装中,他的资料取得也并非当下就把全部的资料取出。
这和你过程中做的动作有关。
(这也就是为什么realm取回的型态是Results而非Array的原因。)
(官方的说明翻译过来是说realm取资料的方式是lazy而非一次取得,所以无需担心资源的问题)
也就是说,如果你要取得资料笔数………就很单纯的写迴圈来处理就好了。
//假设我要取得资料的21~40笔

let results = ream.objects(RLM_User.self)for i in 20...39 {    if let user = result[i] {        print(user.name)    }}

他就是这样处理。

[群组]
卖闹啊!
我知道玩资料库的会想说把一些共同资料对应一定的群组名称。
比如取得父表的资料再用子表对应父表的名称来属于同一群组。
但是realm没有这种东西。
亦即realm「不提供」等同于GROUP BY这种东西。
你不要花时间去想解决这个,realm没有提供直接解这个东西的做法。
但不表示你做不出类似的效果。
这就是再接下来会讲到realm非常强大的「关联」。
有这种东西根本就不要去管GROUP BY了。
再下一篇文章,就会讲到关于realm的 List的型态。
以及强大的反向关联……这绝对是整个realm最重要的架构。
那东西强大到让你省很多事。

--
[目次]
[Swift] Realm.io 资料库介绍 - 其之一:初探CRUD
[Swift] Realm.io 资料库介绍 - 其之二:Migrations 迁移
[Swift] Realm.io 资料库介绍 - 其之三:查询、排序、键结、自动更新、笔数


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章