Anfängerprobleme mit Core Data

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

  • Anfängerprobleme mit Core Data

    Hallo,

    Ich schreibe im Moment an einem Vokabeldatenbank und -abfrage Programm. Seit heute habe ich aber ein Problem mit Core Data.

    Vielleicht ladet ihr euch das Projekt (im Anhang) runter und kompiliert.

    Ich wollte ein Property umbenennen, von language auf vocableLanguage. Nach dem ich den Code geändert habe, habe ich in der Benutzerlibery die SQLite-Datenbank gelöscht. Nach einigen Fehlern beim setzen der Werte hab ich mich dazu entschieden alles Rückgängig zu machen und hab die Property wieder auf language umbenannt. Die Datenbank auch wieder gelöscht und versucht wieder Vokabeln einzutragen. Es kamen immer noch Fehler.
    Also habe ich eine Kopie des Projekts (von vor diesen ganzen Versuchen) vom Schreibtisch in meinen Projectsordner kopiert und hab mein Glück mal wieder versucht.
    Das hat jetzt auch kurz funktioniert bis wieder die Fehlermeldung kommt:
    "+entityForName: could not locate an entity named 'Vocable' in this model."

    Der Fehler tritt beim Hinzufügen einer neuen Vokabel auf.

    Wie bekomm ich meine App wieder dazu, Vokabeln zu speichern?

    Vocable ist aber vorhanden.

    Meldet euch bitte bei Unklarheiten.

    Viele Grüße und tausend Dank

    Manuel
    Ich bin auch bei Apfeltalk und Twitter unter diesem Namen angemeldet.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Unkaputtbar ()

  • Dein Datenmodell wird nicht ins Bundle kopiert, ich vermute, da ist irgendwas bei Deinen undo/redo-Versuchen kaputt gegangen.
    Abgesehen davon wimmelt es in Deinem Projekt nur so vor Fehlern. Ich empfehle Dir dringend, den Cocoa-Fundamentals Guide in der Apple Doku zu lesen.

    Hier noch ein paar Hinweise:
    1.) IMMER getter und setter benutzen (auch in der implementation)
    2.) NIEMALS Obj-C Objektzeiger auf NULL setzen, was Du meinst ist nil
    3.) Modale Dialoge sind auf dem Mac, sagen wir - ungebräuchlich
    4.) MVC
    5.) Memory Management

    Wahrscheinlich solltest Du EInführungsliteratur lesen:
    Hillegass
    Negm-Awad, ganz ganz selten hier im Forum unterwegs, vlt. hast Du Glück
    Stevenson
    Mit allen drei Büchern lernst Du alles, was Du am Anfang über die elementaren Cocoa Konzepte wissen musst, such Dir eins aus.

    Und als Ergänzung:
    Cocoa Design Patterns
  • Noch eine kleine Ergänzung:
    Kommst Du von C++ (TE)? Dein Code und Deine Heransgehensweise erinnert mich an meine ersten Gehversuche mit Obj-C (ich komme von C++). Mit Cocoa sind die Wege etwas anders, meist einfacher. Zwar werden auch nur die gleichen Patterns umgesetzt, aber die Sprachkonzepte sind eben doch verschieden (dynamisch vs statische Typisierung) und dadurch sind mit Cocoa viele Probleme weitaus eleganter zu lösen.

    Insofern war mein erster Post womöglich etwas harsch (Punkt 4 kannste streichen :-). Einfach dranbleiben und versuche, Deine Vorerfahrungen auf die Seite zu legen.

    Gruß, Markus
  • Erstmal vielen Dank für die Verbesserungsvorschläge! ;)

    Aber:

    Wie bekomm ich das Model wieder ins Bundle?

    Und was genau meinst du mit 1.?
    Bei 2. Meinst du so 'self.eine_property = nil' und nicht '= NULL', oder?

    Was sind den Modale Dialoge und wo verwende ich sie?

    Und ich habe das Programmieren erst mit dem Cocoa begonnen. Ich kann kein C++. Und Cocoa Programming for Mac OS X hab ich bereits.

    Aber Trotzdem nochmal Vielen Dank

    Manuel
    Ich bin auch bei Apfeltalk und Twitter unter diesem Namen angemeldet.
  • Mit 1. meine ich, dass jeglicher Zugriff auf Instanzvariablen über getter/setter erfolgen sollte (auch in init/dealloc - Amin, bist Du da?:-=)

    Quellcode

    1. - (id)init
    2. {
    3. self = [ super init ];
    4. if ( self ) {
    5. self.meineProperty = ...
    6. self.nochNeProperty = ...
    7. self.undNochEine = ...
    8. }
    9. return self;
    10. }
    11. -(void)dealloc
    12. {
    13. self.meineProperty = nil;
    14. self.nochNeProperty = nil;
    15. self.undNochEine = nil;
    16. }
    17. // Irgendwo in der Implementation Deiner Klasse:
    18. [ self.meineProperty tueDies ];
    19. [ self.nochNeProperty tueDas ];
    20. self.undNochEine = irgendwas;
    Alles anzeigen

    Das hat den Vorteil, dass Du Speicherlecks vermeidest, Du das Verhalten Deiner Klasser erweiterbar/austauschbar machst und die Klasse KVO konform ist.
    2.) Ja
    Modale Dialoge sind Dialoge, die die Anwendung blockieren. Guckst Du hier.

    Am einfachsten wird es sein, einfach eine neue CoreData App mit Xcode zu erstellen, ich vermute es fehlt eine Copy Files Build Phase im Target. Ehe Du das gesucht/gefunden und repariert hast, hast Du das Projekt dreimal angelegt. Schneller als man Blaubeerpfannkuchen sagen kann sozusagen...:-)
  • Manfred Kreß schrieb:

    Hol dir mal die Infos von deinem .xdatamodel file. Schau unter "Targets" nach ob der Haken bei deiner Anwendung gesetzt ist.

    Gruß Manfred


    Danke Manfred! Das hat es wieder hinbekommen ;)

    Markus Müller schrieb:

    Mit 1. meine ich, dass jeglicher Zugriff auf Instanzvariablen über getter/setter erfolgen sollte (auch in init/dealloc - Amin, bist Du da?:-=)
    Das hat den Vorteil, dass Du Speicherlecks vermeidest, Du das Verhalten Deiner Klasser erweiterbar/austauschbar machst und die Klasse KVO konform ist.
    2.) Ja
    Modale Dialoge sind Dialoge, die die Anwendung blockieren. Guckst Du hier.

    Also dass ich im Init z.B. Controller anderer Klassen bereits setze indem ich mir z.B. eine "initWithController: andContext:" bastel?
    Aber ein Modaler Dialog erfüllt aber hier den Sinn, denn ich will. Der Nutzer soll am Hauptfenster nichts ändern können.

    Dieses Forum ist super ;) Tolle Leute sind hier unterwegs, die auch sehr nett helfen.;-)

    Vielen Dank

    Manuel
    Ich bin auch bei Apfeltalk und Twitter unter diesem Namen angemeldet.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Unkaputtbar ()

  • Mit MVC meinst du Model-View-Controller, oder?
    Aber was mache ich da denn im Moment noch sehr falsch?
    Ich hage ja zwei Models, sind aber Models zur Nutzerdatenspeicherung. Was sollte man den hier noch besser über ein Model realisieren?

    Manuel

    PS: Sind Doppelposts hier nicht gerne gesehen?
    Ich bin auch bei Apfeltalk und Twitter unter diesem Namen angemeldet.
  • In Deinem BoxController hast Du in pushAddVocable und pushStartRequest ein Speicherleck (Zugriff auf ivars addVocable sowie requestVocable sollte über setter erfolgen).
    Ausserdem erzeugst Du die entspr. Controller bei jedem Klick. Besser wäre es, diese ins Nib zu packen und über outlets (@property (assign) IBOutlet AddVocableWindowController *addVocable mit entspr. @synthesize) darauf zuzugreifen.