การเปรียบเทียบสตริงกับ NSPredicate ก่อนที่จะบันทึกลงใน Core Data

ฉันกำลังพยายามเปรียบเทียบสตริงก่อนที่จะบันทึกลงใน 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 ได้อย่างไร


person Joe    schedule 01.04.2021    source แหล่งที่มา
comment
ดูเหมือนว่าผลลัพธ์ของการออกแบบที่ไม่เหมาะสม ทำไมแบบฝึกหัดในสตริงจึงแทนที่จะเป็นเอนทิตีของตัวเอง   -  person Joakim Danielson    schedule 01.04.2021
comment
หากคุณไม่เต็มใจที่จะเปลี่ยนการออกแบบ ฉันไม่เห็นวิธีอื่นนอกจากแยกสตริงอินพุตและสร้างชุดจากผลลัพธ์ จากนั้นโหลดออบเจ็กต์ ทั้งหมด จาก Core Data และแปลงข้อมูลในลักษณะเดียวกัน upperBody แอตทริบิวต์ลงในอาร์เรย์ของ Set จากนั้นตรวจสอบว่ามีชุดแรกอยู่ในอาร์เรย์นั้นหรือไม่   -  person Joakim Danielson    schedule 01.04.2021
comment
SavedExerciseSets มีคุณลักษณะอื่นๆ อีกสองสามรายการ upperBody เป็นแอตทริบิวต์เดียวที่ฉันต้องตรวจสอบก่อนบันทึกโมเดลลงใน SavedExerciseSets ไม่แน่ใจว่าทำไมฉันต้องแยกมันออกเป็นเอนทิตีของมันเอง   -  person Joe    schedule 02.04.2021
comment
เพราะมันเป็นสิ่งที่ถูกต้องที่จะทำจากมุมมองของการออกแบบ IMO แต่คุณสามารถใช้วิธีแก้ปัญหาอื่น ๆ ที่ฉันแนะนำหรือวิธีแก้ปัญหาที่แนะนำด้านล่างได้ตลอดเวลา   -  person Joakim Danielson    schedule 02.04.2021
comment
SavedExerciseSets มีอยู่ใน CoreData ของคุณจริง ๆ "Running Rowing Burpees" หรือไม่ ฉันหมายถึงตัวพิมพ์ใหญ่ทั้งหมดที่จุดเริ่มต้นของแต่ละคำเหรอ?   -  person Larme    schedule 04.04.2021
comment
@ลาร์เม่ ใช่ครับ พวกเขาทั้งหมดเป็นตัวพิมพ์ใหญ่   -  person Joe    schedule 04.04.2021
comment
เอนทิตีของคุณ upperBody มีแอตทริบิวต์ sortedComponents เช่น อาร์เรย์ที่เรียงลำดับของสตริงหรือไม่ หากเป็นเช่นนั้น โค้ดของคุณควรใช้งานได้ ไม่เช่นนั้นจะไม่ทำงาน เนื่องจาก SQL ไม่สามารถแยกย่อยและเรียงลำดับแอตทริบิวต์สตริงก่อนที่จะดึงข้อมูลได้   -  person Reinhard Männer    schedule 04.04.2021


คำตอบ (1)


สมมติว่า sortedComponents ของคุณเป็นประเภท String บางทีคุณอาจลองสิ่งนี้:

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

แต่หาก sortedComponents ของคุณเป็นประเภท [String] รหัสในคำถามควรจะใช้งานได้อยู่แล้ว เพียงตรวจสอบให้แน่ใจว่าคุณได้บันทึก exerciseGroup ที่ได้จัดเรียงไว้แล้วลงในข้อมูลหลักแล้ว

person ramacode    schedule 05.04.2021
comment
เพียงตรวจสอบให้แน่ใจว่าคุณได้บันทึกลงในข้อมูลหลักกลุ่มแบบฝึกหัดที่เรียงลำดับไว้แล้ว นั่นคือกุญแจสำคัญ!! ขอบคุณมากครับ @ramacode ฉันพลาดขั้นตอนนั้นอย่างชัดเจน :) - person Joe; 05.04.2021
comment
ฮ่าๆ ยินดีต้อนรับครับ! ควรเพิ่มการบันทึกไปยังการใช้งานข้อมูลหลักในคำถาม อย่างไรก็ตาม ดีใจที่คุณแก้ไขปัญหาได้! - person ramacode; 06.04.2021