Realm 3中如何用NSPredicate过滤基本类型数组?如何存储字符串数组元素?
嘿,这两个Realm相关的问题我熟,给你一步步讲清楚怎么解决~
一、在Realm中存储字符串数组的变通方案
Realm本身不支持直接存储[String]这类基本类型的数组,所以我们得搞个小包装类来绕开这个限制——把单个字符串包装成Realm能识别的Object子类,再用List来存储这些包装对象。
完整的代码实现如下:
import RealmSwift // 包装单个字符串的Realm对象类 class RealmString: Object { @objc dynamic var value = "" // 自定义便捷初始化方法,直接传字符串就能创建实例 convenience init(value: String) { self.init() self.value = value } // 以下是Realm要求必须实现的初始化方法 required init(realm: RLMRealm, schema: RLMObjectSchema) { super.init(realm: realm, schema: schema) } required init() { super.init() } required init(value: Any, schema: RLMSchema) { super.init(value: value, schema: schema) } } // 包含字符串数组字段的目标模型类 class Realm2Element: Object { // 用List<RealmString>替代原本的[String]类型 let tags = List<RealmString>() // 可以加个便捷方法,快速把普通字符串数组转成Realm支持的结构 func setTags(from stringArray: [String]) { tags.removeAll() stringArray.forEach { tags.append(RealmString(value: $0)) } } }
使用时,你可以通过setTags(from:)快速把普通字符串数组转成Realm兼容的List结构;读取时,遍历tags列表取出每个元素的value字段,就能还原成普通数组啦。
二、Realm 3中使用NSPredicate过滤基本类型数组
因为我们用了RealmString包装类,过滤时要针对包装类的value字段写谓词,以下是几种常见的过滤场景:
过滤包含指定标签的元素
比如找出所有包含"swift"标签的Realm2Element对象:let predicate = NSPredicate(format: "tags.value CONTAINS %@", "swift") let results = realm.objects(Realm2Element.self).filter(predicate)过滤包含所有指定标签的元素
比如找出同时包含"swift"和"realm"标签的对象:let predicate = NSPredicate(format: "ALL tags.value IN %@", ["swift", "realm"]) let results = realm.objects(Realm2Element.self).filter(predicate)过滤包含任一指定标签的元素
比如找出包含"swift"或"realm"标签的对象:let predicate = NSPredicate(format: "ANY tags.value IN %@", ["swift", "realm"]) let results = realm.objects(Realm2Element.self).filter(predicate)过滤不包含指定标签的元素
比如找出完全不包含"objective-c"标签的对象:let predicate = NSPredicate(format: "NONE tags.value == %@", "objective-c") let results = realm.objects(Realm2Element.self).filter(predicate)
要注意的是,Realm的谓词语法和普通Foundation谓词有细微区别,针对集合类型的过滤,一定要配合ALL/ANY/NONE这些限定词使用哦。
内容的提问来源于stack exchange,提问作者iOS User
相关产品推荐
相关产品推荐

