Membandingkan string dengan NSPredicate sebelum menyimpan ke Data Inti

Saya mencoba melakukan perbandingan string sebelum menyimpan ke Data Inti.

String yang disimpan ke Data Inti akan berisi daftar latihan fisik. Rangkaian latihan hanya boleh disimpan satu kali apa pun urutannya.

Contoh:

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.

Kemajuan saya:

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)")
    }
}

Dalam kode saya, saya mencoba membandingkan hasil yang diambil (string) di Data Inti, dengan string baru yang saya coba simpan.

Masalah saya adalah saya terus mendapatkan 0 - yang menyebabkan upaya penyimpanan gagal setiap saat.

Bagaimana cara membandingkan string yang saya coba simpan, dengan string yang muncul di Data Inti?


person Joe    schedule 01.04.2021    source sumber
comment
Ini sepertinya hasil desain yang kurang maksimal, kenapa latihannya berupa string bukannya menjadi entitas tersendiri?   -  person Joakim Danielson    schedule 01.04.2021
comment
Jika Anda tidak ingin mengubah desain, saya tidak melihat cara lain selain membagi string input dan membuat Set dari hasil dan kemudian memuat semua objek dari Data Inti dan dengan cara yang sama mengonversi upperBody atribut ke dalam array Set dan kemudian periksa apakah set pertama ada dalam array itu   -  person Joakim Danielson    schedule 01.04.2021
comment
SavedExerciseSets berisi beberapa atribut lainnya. upperBody adalah satu-satunya atribut yang perlu saya periksa sebelum menyimpan model ke SavedExerciseSets. Tidak yakin mengapa saya harus memecahnya menjadi entitasnya sendiri   -  person Joe    schedule 02.04.2021
comment
Karena ini adalah hal yang benar untuk dilakukan dari sudut pandang desain IMO tetapi Anda selalu dapat menggunakan solusi yang saya sarankan lainnya atau solusi yang disarankan di bawah ini.   -  person Joakim Danielson    schedule 02.04.2021
comment
Apakah SavedExerciseSets yang ada di CoreData Anda benar-benar "Running Rowing Burpees"? Maksud saya dengan huruf besar semua di awal setiap kata?   -  person Larme    schedule 04.04.2021
comment
@Larme Ya. Semuanya huruf besar.   -  person Joe    schedule 04.04.2021
comment
Apakah entitas Anda upperBody memiliki atribut sortedComponents, yaitu larik string yang diurutkan? Jika demikian, kode Anda akan berfungsi, jika tidak, karena SQL tidak dapat menguraikan dan mengurutkan atribut string sebelum diambil.   -  person Reinhard Männer    schedule 04.04.2021


Jawaban (1)


Dengan asumsi sortedComponents Anda bertipe String, mungkin Anda dapat mencoba ini:

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

Namun, jika sortedComponents Anda bertipe [String], kode dalam pertanyaan seharusnya sudah berfungsi, pastikan Anda menyimpan exerciseGroup yang sudah diurutkan ke data inti.

person ramacode    schedule 05.04.2021
comment
pastikan saja Anda menyimpan ke data inti grup latihan yang sudah diurutkan. Itu kuncinya!! Terima kasih banyak @ramacode. Saya jelas melewatkan langkah itu :) - person Joe; 05.04.2021
comment
Haha sama-sama! Seharusnya menambahkan implementasi penyimpanan ke data inti dalam pertanyaan. Namun, senang Anda menyelesaikan masalahnya! - person ramacode; 06.04.2021