Core Data

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hallo Zusammen,
    ich versuche mich grade in Core Data mit Swift einzuarbeiten.
    Ich komme aus der Windows Ecke und kenne C# recht gut.

    Dort habe ich es mir angewöhnt Klassen zu erstellen die sich um die Verwaltung der Daten kümmern.
    Also lesen schreiben filtern löschen usw. Diese Klassen nenne ich dann [EntityName]Repository.

    Hier habe ich ein paar Probleme.
    Unbenannt.png
    In der Klasse wird das AppDelegate als undeclared type angezeigt.
    Und meine generierten Entities sind als unresolved identifier angezeigt.
    Führe ich die App im Debug Modus aus startet und funktioniert die App ohne Probleme.

    Dann möchte ich Daten natürlich auslesen und über die func zurückgeben.
    Hier bräuchte ich etwas Unterstützung.
    Ist die Umsetzung so OK?

    Quellcode

    1. /**Fetches all records from "Day" Entity
    2. :returns NSObject?*/
    3. func FetchDays() ->[Day]?{
    4. var result:[Day]
    5. do{
    6. let request = NSFetchRequest(entityName: Day.EntityName)
    7. result = try self.managedObjectContext.executeFetchRequest(request) as! [Day]
    8. if result.count > 0 {
    9. return result
    10. }
    11. }
    12. catch let error as NSError{
    13. print("\(Day.EntityName) not fetched \(error)")
    14. print(error.localizedDescription)
    15. print(error.localizedFailureReason)
    16. print(error.localizedRecoveryOptions)
    17. print(error.localizedRecoverySuggestion)
    18. }
    19. return nil
    20. }
    Alles anzeigen


    So müsste ich doch ein Array des Datentyps meiner Entity erhalten?


    Des weiteren würde ich gerne auf den Inhalt eines eines Entity Objektes zugreifen.
    Hier scheine ich aber nicht den gewünschten Value anzusprechen, da der gespeicherte Wert nicht in meiner Switch Funktion erkannt wird.
    Was ist falsch?

    Quellcode

    1. let repository:DayRepository = DayRepository()
    2. var days:[Day]? = [Day]()
    3. days = repository.FetchDays()!
    4. for d in days!{
    5. switch d{
    6. case d.valueForKey("day") as! String == lbl_MondaySwitch.text:
    7. switchMonday.on = true
    8. default: break
    9. }

    Ausserdem habe ich die Keys und den Namen der Entity den Subklassen der durch Xcode generierten NSManagedOject Klassen hinterlegt um über Punktnotation darauf zugreifen zu können.
    Wäre es eventuell besser meine Logik zur Datenverwaltung auch hier zu hinterlegen?
    Beim neu generieren kann die neuen Subklassen ja gegen die alten austauschen also nicht überschreiben und neue Logik implementieren.

    Bin ich als Neuling hier schon auf dem richtigen Weg?
  • Ohne mich tiefer in deinen Code eingelesen zu haben: Die Klassen für Core-Data-Entitätstypen musst du von NSManagedObject ableiten. Xcode kann dir diese Klassen generieren. Es macht im Allgemeinen wenig Sinn, Konzepte aus anderen Programmiersprachen bzw. Betriebssystemen auf Cocoa übertragen zu wollen.
    „Meine Komplikation hatte eine Komplikation.“
  • Ja,
    da gibt es etwas.
    Werd ich mir bestellen.

    Aber nur Interesse halber.
    Es wird doch auch hier die Möglichkeit geben den Code zur Kommunikation mit Core Data so zu kapseln, dass man hier die Methoden nicht doppelt schreiben muss.

    Ich dachte halt, dass ich die Anfragen nach dem Motto "Hey Core Data liefer mir mal meine Daten zu der meiner Entity xy" oder "Hey Core Data ich habe hier Daten der Entity xy" speicher die für mich mal weg usw.

    Dann könnte ich die Methoden so in verschiedenen ViewControllern nutzen ohne hier Code doppelt schreiben zu müssen.
  • Das hat doch nichts mit Core-Data zu tun. Das ist doch eine Frage des objekt-orientierten Designs.

    Core-Data merkt sich die Änderungen der Entitäten und speichert sie automatisch, wenn man an den Kontext die Nachricht save: schickt. DAOs sind auch mit Core-Data möglich aber eher unüblich, da sie schnell zu einem schlechten Design führen. Stattdessen sollte man lieber Cocoa- bzw. Core-Data-typische Mittel (z. B. Kategorien oder Anfragetemplates) verwenden.
    „Meine Komplikation hatte eine Komplikation.“