2016-05-03 9 views
0

Ich habe eine Tabellenansicht, die eine Liste von Objekten des Typs String unter Verwendung von Core Data anzeigt, wo der Benutzer weiterhin neue Objekte zu dieser Tabelle hinzufügen kann. Es gibt jedoch eine Einschränkung, die es nicht erlaubt, Duplikate hinzuzufügen. Ich habe es geschafft, Duplikate zu vermeiden, die zum Beispiel gleich sind: "Bank"/"Bank". Problem ist, dass ich auch solche Duplikate blockieren muss: "Bank"/"bAnk" oder "Bank"/"Bank" und so weiter, aber ich habe keine Ahnung, wie ich das machen soll.Wie vermeidet man Doppeleinträge in Array mit Groß- und Kleinschreibung in Groß- und Kleinschreibung in Groß- und Kleinschreibung in Swift?

Hier ist mein Code:

func checkDuplicates(catName: String) -> Bool { 
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let managedContext = appDelegate.managedObjectContext 
    var contents = [NSManagedObject]() 
    var items = [String]() 
    let fetchRequest = NSFetchRequest(entityName: "Categories") 
    do { 
     let results = try managedContext.executeFetchRequest(fetchRequest) 
     contents = results as! [Items] 
     for item in contents { 
      items.append(item.valueForKey("name") as! String) 
     } 
    } catch { 
     print("error") 
    } 

    if items.contains(catName) { 
     return true 
    } 
    return false 
} 

Es gibt eine Bool, so dass, wenn es ein Duplikat zurückgibt Ich zeige eine Warnung erklärt dem Benutzer, er ein Duplikat hinzufügen können.

Also kann mir hier jemand helfen?

Antwort

4

Es besteht keine Notwendigkeit alle Objekte, um für bestehende Core Data Objekte zu überprüfen, um zu holen ist. Sie können eine Anfrage mit einem Prädikat holen erstellen, die für Objekte mit dem angegebenen Namen sucht:

let fetchRequest = NSFetchRequest(entityName: "Categories") 
fetchRequest.predicate = NSPredicate(format: "name ==[c] %@", catName) 

Hier ==[c] stehen für Groß- und Kleinschreibung Vergleich.

In der Tat müssen Sie Objekte überhaupt nicht holen. Sie können Check für passende Objekte mit countForFetchRequest():

var error : NSError? = nil 
let count = managedContext.countForFetchRequest(fetchRequest, error: &error) 
if count == NSNotFound { 
    print("error:", error!.localizedDescription) 
    return false 
} else if count >= 1 { 
    return true 
} else { 
    return false 
} 

Das ist viel effektiver, weil die Abrufanforderung als ausgeführt wird „SELECT COUNT ...“ Abfrage auf der SQLite-Ebene, ohne das Abrufen die Objekte in Erinnerung.

+0

Dies ist ein besserer Ansatz, da ich kein Array erstellen muss !!! Beste Antwort!! –

1

Sie können die Strings Kleinbuchstaben sowohl für den Vergleich Groß- und Kleinschreibung Probleme zu vermeiden:

let Item_Name = item.valueForKey("name") as! String 
items.append(Item_Name.lowercaseString); 

und

if items.contains(catName.lowercaseString) { 
    return true 
} 
+0

Das hat perfekt funktioniert !!! –

1

Sie Ihre eigene Logik für die contains Methode angeben. Schauen

let animals = ["Dog", "Cat", "Fish"] 
let newAnimal = "dog" 
let duplicate = animals.contains { $0.lowercaseString == newAnimal.lowercaseString } 
print(duplicate) // true 
Verwandte Themen