【问题标题】:Swift: Realm How to filter Int contains number as StringSwift:Realm 如何过滤 Int 包含数字作为字符串
【发布时间】:2020-07-09 15:34:14
【问题描述】:

我有一个字符串输入“searchText”,如果 id(Int) 在“searchText”中包含任何数字,我需要检查领域过滤器

let searchText = "118523"

let messages:Results<ChatMessage> = realm
    .objects(ChatMessage.self)
    .filter("body CONTAINS %@ OR id CONTAINS %@" , searchText, searchText)
    .sorted(byKeyPath: "timeStamp", ascending: true)

【问题讨论】:

  • 澄清一下,您想为 searchText 字符串中的任何数字过滤您的领域对象吗?所以过滤对象全身或 id 包含“1”或“8”或“5”...?
  • 完全正确....

标签: swift realm


【解决方案1】:

据我了解,给定一组字符,OP 希望找到在 id(或正文)中包含任何这些字符的任何聊天消息。我将 body 排除在外,因为任何领域的模式都是相同的。

let searchText = "118523"
let charArray = Array(searchText) //casts each element to an Array of Characters

var predicateArray = [NSPredicate]()
for element in charArray {
    let searchChar = String(element) //cast each Character to a string 
    let predicate = NSPredicate(format: "id CONTAINS %@", searchChar)
    predicateArray.append(predicate)
}

let predicates = NSCompoundPredicate(orPredicateWithSubpredicates: predicateArray)

let results = realm.objects(ChatMessage.self).filter(predicates)
for msg in results {
    print(msg)
}

解释

首先,searchText 被分解为单个字符并存储在一个数组中。

然后,使用循环,使用每个字符构建一个 NSPredicate 以查看 id 是否包含该字符。请注意,我们需要将 Swift Character 转换为要在谓词中使用的字符串。每个谓词都存储在谓词数组中。

然后这些谓词作为 OR 连接在一起成为一个 NSCompoundPredicate。

最后,我们过滤 Realm ChatMessage 对象,找出包含每个 Predicate 中任何字符的任何 id,例如“1”或“1”或“8”等。

如果我们使用 Set 而不是只存储唯一值的数组,这可能会更有效一些,例如过滤“1”或“1”没有意义 - 只需一个“1”就足够了。

【讨论】:

    猜你喜欢
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多