Swift中Realm如何筛选包含指定数字字符串的Int类型id
解决Realm中Int类型id匹配字符串数字的问题
嘿,我一眼就看到你代码里的问题啦——Realm的CONTAINS操作符只能作用于字符串类型的属性,而你的id是Int类型,直接这么写要么会报错,要么根本得不到正确的筛选结果。下面分两种常见需求给你对应的解决方案:
需求1:id的字符串形式包含完整的searchText
如果你想匹配的是id转成字符串后包含整个searchText(比如searchText是"185",id=118523就算匹配),可以用Realm内置的string()函数把Int类型的id转成字符串,再用CONTAINS:
let searchText = "118523" let messages: Results<ChatMessage> = realm .objects(ChatMessage.self) .filter("body CONTAINS %@ OR string(id) CONTAINS %@", searchText, searchText) .sorted(byKeyPath: "timeStamp", ascending: true)
这个方法简单直接,适合需要完整匹配子串的场景。
需求2:id包含searchText中的任意单个数字
如果你的真实需求是id只要包含searchText里的任意一个数字(比如searchText是"118523",id=12、89、50这类都算匹配),那需要先提取searchText里的唯一数字,再构建多条件OR筛选:
let searchText = "118523" // 先收集筛选条件,默认包含body的匹配 var filterConditions = ["body CONTAINS %@"] // 提取searchText中的唯一数字字符,避免重复条件 let uniqueDigits = Set(searchText).filter { $0.isNumber } if !uniqueDigits.isEmpty { // 为每个数字构建id的匹配条件 let idMatchConditions = uniqueDigits .map { "string(id) CONTAINS '\($0)'" } .joined(separator: " OR ") filterConditions.append("(\(idMatchConditions))") } // 组合最终的筛选条件 let finalFilter = filterConditions.joined(separator: " OR ") // 执行筛选 let messages: Results<ChatMessage> = realm .objects(ChatMessage.self) .filter(finalFilter, searchText) .sorted(byKeyPath: "timeStamp", ascending: true)
这样处理的好处是:
- 自动去重重复的数字,避免生成冗余的筛选条件
- 边界情况处理:如果searchText里没有数字,只会筛选body包含searchText的结果,不会出错
内容的提问来源于stack exchange,提问作者Sabrysoft
相关产品推荐
相关产品推荐

