在保存到核心数据之前将字符串与 NSPredicate 进行比较

Posted

技术标签:

【中文标题】在保存到核心数据之前将字符串与 NSPredicate 进行比较【英文标题】:Comparing strings with NSPredicate before saving to Core Data 【发布时间】:2021-06-28 04:04:27 【问题描述】:

我正在尝试在保存到 Core Data 之前执行字符串比较。

保存到 Core Data 的字符串将包含一个体育锻炼列表。练习串只能保存一次无论顺序如何

示例:

let str1 = "Burpees Rowing Running"
// This is in Core Data

let str2 = "Running Rowing Burpees"
// This is an attempt to save to Core Data. It should *fail* because there is already an exercise set with these exercises - just not in the same order.

我的进步:

func checkEntityThenSave(exerciseGroup:String)
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "SavedExerciseSets")
    let predicate = NSPredicate(format: "upperBody.sortedComponents == %@", exerciseGroup.components(separatedBy: " ").sorted())
    
    request.predicate = predicate
    request.fetchLimit = 1

    do
        let count = try context.count(for: request)
        
        print("Count - \(count)") // Always evaluates to 0

        if(count > 0)
            // Save to Core Data
        
        else
            // Show Alert
        
      
    catch let error as NSError 
        print("Could not fetch \(error), \(error.userInfo)")
    

在我的代码中,我试图将 Core Data 中获取的结果(字符串)与我尝试保存的新字符串进行比较。

我的问题是我一直得到 0 - 这导致每次保存尝试都失败。

如何将我尝试保存的字符串与 Core Data 中出现的字符串进行比较?

【问题讨论】:

这看起来像是不是那么优化设计的结果,为什么练习在一个字符串中而不是它们自己的实体? 如果您不愿意更改设计,我认为除了拆分输入字符串并从结果中创建一个 Set 然后从 Core 加载 all 对象之外别无他法数据并以同样的方式将upperBody属性转换为Set数组,然后检查该数组中是否存在第一个集合 SavedExerciseSets 包含一些其他属性。在将模型保存到 SavedExerciseSets 之前,upperBody 是我需要检查的唯一属性。不知道为什么我需要把它分解成自己的实体 因为从 IMO 设计的角度来看这是正确的做法,但您始终可以使用我的其他建议解决方案或下面建议的解决方案。 CoreData 中的SavedExerciseSets 真的是"Running Rowing Burpees" 吗?我的意思是每个单词的开头都是大写的? 【参考方案1】:

假设您的sortedComponentsString 类型,也许您可​​以试试这个:

let sortedExerciseGroup = exerciseGroup.components(separatedBy: " ").sorted().joined(separator: " ")
let predicate = NSPredicate(format: "upperBody.sortedComponents == %@", sortedExerciseGroup)

但是,如果您的 sortedComponents[String] 类型,则问题中的代码应该已经可以工作,只需确保将已排序的 exerciseGroup 保存到核心数据。

【讨论】:

“只需确保将已排序的练习组保存到核心数据”这是关键!非常感谢@ramacode。我显然错过了那一步:) 哈哈,不客气!应该在问题中添加了保存到核心数据的实现。不过,很高兴您解决了问题!

以上是关于在保存到核心数据之前将字符串与 NSPredicate 进行比较的主要内容,如果未能解决你的问题,请参考以下文章

如何在保存到核心数据之前验证上下文中的值

将对象保存在核心数据中(字符串属性,双精度数组)

iOS - 数据保存一次到核心数据中

如何将书签添加到 UITableViewCell 并保存到核心数据?

Redis核心原理与实践--字符串实现原理

如何使用核心数据访问保存在不同视图控制器中的阵列?