Probleme mit plists (NSDictionary)

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

  • Probleme mit plists (NSDictionary)

    Nabend.
    Ich hoffe ihr könnt mir bei einem Problem helfen, bei dem ich absolut ratlos bin.
    Ich schreibe eine App für meine Schule, und in einer Ansicht sollen alle Lehrernamen (Nachnamen) in einem TableView angezeigt werden. Soweit so gut.
    Es handelt sich um 78 Lehrer, weshalb ich mir gedacht habe, dass das nach einer plist schreit :D

    Ich habe also folgende Methode zum auslesen der plist Datei (LEHRER.plist):

    Quellcode

    1. //Implementation//Nun muss die Plist mit den Lehrernamen (+ Rest) eingelesen werden
    2. NSString *path = [[NSBundle mainBundle] pathForResource: @"LEHRER" ofType:@"plist"];
    3. NSDictionary *lehrerDictionary = [[NSDictionary alloc]initWithContentsOfFile:path];
    4. NSMutableArray *lehrerArray = [[NSMutableArray alloc]init];
    5. [lehrerDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop)
    6. {
    7. [lehrerArray addObject:obj];
    8. [lehrerArray retain]; }];
    9. NSLog(@"Array: %@", lehrerArray);
    10. }
    Alles anzeigen




    Um folgende plist auszulesen:







    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    3. <plist version="1.0">
    4. <dict>
    5. <key>FAECHER</key>
    6. <array>
    7. <string>M/Sp
    8. </string>
    9. <string>D/Ku
    10. </string>
    11. [...]
    12. <string>E/Pa
    13. </string>
    14. <string>M/E/If
    15. </string>
    16. <string>Sp</string>
    17. </array>
    18. <key>KUERZEL</key>
    19. <array>
    20. <string>Bk
    21. </string>
    22. [...]
    23. <string>Zn
    24. </string>
    25. <string>Za
    26. </string>
    27. </array>
    28. <key>NACHNAME</key>
    29. <array>
    30. <string>Beckers
    31. </string>
    32. [...]
    33. <string>Zahran
    34. </string>
    35. <string>Zamorano
    36. </string>
    37. </array>
    38. <key>VORNAME</key>
    39. <array>
    40. <string>Dennis
    41. </string>
    42. [...]
    43. <string>Julia
    44. </string>
    45. <string>José
    46. </string>
    47. </array>
    48. </dict>
    49. </plist>
    Alles anzeigen


    Das Problem an der Sache: Wenn ich mir das Dictionary ausgeben lasse werden alle Umlaute in - wenn ich mich nicht irre - ihrer UTF8 Codierung ausgegeben, weshalb ich mit den Daten so nicht arbeiten kann. Wie lese ich die plist denn nun korrekt aus?

    Ausserdem ist ein weiteres problem, dass mein lehrerArray jedes Mal leer bleibt.

    Eventuell wirkt die Funktion zum auslesen sehr hässlich und schlecht, das tut mir leid, aber es ist gefühlt die zehnte Methode mit der ich es nun probiere.
    Meine Keys in der plist sind "NACHNAMEN", "VORNAMEN", "KUERZEL" und "FAECHER". Leider liefert auch

    Quellcode

    1. NSMutableArray *lehrerArray = [lehrerDictionary objectForKey:@"NACHNAMEN"];NSLog(@"%i", [lehrerArray count]);NSLog(@"%@", lehrerArray);

    Die Ausgabe "0" bzw. "(null)".
    Was mache ich falsch? :S

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

  • Das sieht für mich etwas chaotisch aus.

    Du setzt nen Pfad zu ner Datei und ziehst aus diesen Inhalten ein Dictionary.
    Das sollte die Umlaute in UTF-8 umwandeln, wie du es schon richtig erkennst. Wenn dein Texteditor die PLIST aber nicht im UTF-8 Datenformat gespeichert hat, dann sieht das unter Umständen unleserlich aus.
    In dem Fall hilft es entweder das Encoding anzugeben oder die Ursprungsdatei als UTF-8 zu speichern.

    Dann iterierst du über jedes einzelne Objekt mit key und object und wirfst dieses Objekt in ein Array.

    Sinnloserweise wirfst du auch noch bei jedem Durchlauf ein weiteres Retain an dein Array, welches dir eh schon gehört - du produzierst also ein Speicherleck.
    Ich glaube, du weißt gar nicht so genau, was du da eigentlich tust.

    Die PLIST sieht ja ganz nett aus, aber hast du auch ne Zuordnung zu den Lehrern und den Fächern?
    Was willst du mit dem Array, wenn du ja offenbar bequem auf das Dictionary zugreifen kannst?

    Ein kleiner Link dazu von StackOverflow:
    stackoverflow.com/questions/2274022/nsdictionary-to-nsarray

    Antwort 2 ist zwar richtig, Antwort 1 hingegen unglaublich wichtig!
    Unbedingt durchlesen und verstehen!

    Wenn du Verständnisprobleme hast frag nach, wenn du es verstanden hast und immer noch Unterstützung brauchst formuliere deine Frage neu. :)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Danke für eure schnelle Antwort! :)

    @Lucas:
    Mein Dictionary, dass ich aus der plist auslesen möchte, besteht ja aus vier einzelnen Arrays. Ist das schon problematisch bzw. unclever? Sollte ich lieber eine Klasse Lehrer erstellen, die vier Eigenschaften besitzt, und die Objekte in der plist speichern? Wenn ich jetzt die Informationen eines Lehrers #39 auslesen möchte, müsste das ja vier mal über den Aufruf [mutableArray objectAtIndex:37]; geschehen.


    Zu meinem Problem fehlender Ausgabe "(null)":
    Ich habe leider immer

    Quellcode

    1. NSMutableArray *nachnamenArray = [[NSMutableArray alloc]initWithObjects:[lehrerDictionary objectForKey:@"NACHNAMEN"], nil];

    geschrieben, mein Key ist aber "NACHNAME". Sorry dafür. :)

    Jetzt funktioniert das speichern im Array problemlos, jedoch kommt

    Quellcode

    1. "Tr\U00f6mel\n",
    sowas dabei raus.

    Nach ner Möglichkeit zum Encoding habe ich auch gesucht, jedoch weiß ich nicht wie ich das meinem Array sagen soll. Muss ich jetzt jedes Objekt einzeln durchlaufen ?


    Vielen Dank nochmal :)
  • Ich glaube, du hast es nicht verstanden.
    Der Aufbau des Dictionaries ist okay. Und wenn an Position 34 in jedem der vier Arrays die jeweils passende Information steht ist alles gut.
    Dennoch: du brauchst das fertige Dictionary nicht in ein Array umbauen. Siehe Link in meinem vorherigen Beitrag.

    Dem Array kannst du überhaupt nichts über das Encoding sagen. Das geht offenbar leider auch nicht bei den Dictionaries sondern nur bei Texten.
    Also liegt der Fehler im Datenformat: deine PLIST-Datei ist nicht als UTF-8 Datei gespeichert.
    Den von Sauerzapf vorgeschlagenen Weg zum Erstellen einer PLIST solltest du mal ausprobieren.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P