Tableview reloadData funktionier erst beim 2.mal (GELÖST)

  • Tableview reloadData funktionier erst beim 2.mal (GELÖST)

    hallo,
    ich habe eine Funktion, die in einem TableView nach Klick eines Add-Buttons (+-Button rechts oben in der Navbar) eine Zelle zur Tabelle hinzufügen soll und diese mit einem Namen aus der Datenbank füllt. Betätig ich den Button und damit meine Methode, passiert sichtbar nichts. Beim 2.Betätigen dann erscheint eine neue Zelle.
    Wenn ich nach dem ersten Betätigen die app neu starte, dann wird die neue Zeile auch angezeit. Somit gehe ich davon aus, dass mein reload nicht wirklich direkt funktioniert. hier mal meine Methode.

    Quellcode

    1. -(IBAction)addItem:(id)sender {
    2. [database openDB:@"Content"];
    3. countVC = [database getDataWithStmt:@"SELECT MAX(VC) FROM Main"];
    4. int a = [countVC integerValue];
    5. a=a+1;
    6. NSString *str = [NSString stringWithFormat:@"%d)",a];
    7. NSString *stmt = @"INSERT INTO Main (VC) VALUES (";
    8. stmt = [stmt stringByAppendingString:str];
    9. [database insertDatawithStmt:stmt];
    10. [database closeDB];
    11. [self.tableView reloadData];
    12. }
    Alles anzeigen


    die Anzhal der Zellen holt sich die Vie in der ViewDidLoad aus eine Datenbank.

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

  • lbremen schrieb:

    die Anzhal der Zellen holt sich die Vie in der ViewDidLoad aus eine Datenbank.

    Eventuell ist die ViewDidLoad da der falsche Ansatz. Überhaupt finde ich den Ansatz mit der Datenbank gruselig. Kommst du von Android?
    «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
  • nope komme nicht von Android. ich muss die Datenbank nutzen, das tut mir auch weh, aber es ist so gewollt.

    Quellcode

    1. [self.tableView reloadData];


    läd dich die View neu oder? also müsste dann doch auch als erstes wieder die ViewDidLoad abgefragt werden. komisch ist, dass es beim 2.mal drücken funktioniert.
  • lbremen schrieb:

    Quellcode

    1. [self.tableView reloadData];

    läd dich die View neu oder?

    Wie kommst du darauf? Es heißt 'reloadData'. Das bedeutet, die Daten werden neu geladen. Würde es das View neu laden, hieße es 'reloadView'. Heißt es aber nicht. Es heißt reloadData.
    Du kommst wohl nicht umhin die Anzahl der Einträge woanders als im ViewDidLoad vorzuhalten.

    Entweder du liest bei jedem numberOfRows: die Anzahl aus der Datenbank (das Ding wird sehr, sehr oft getriggert, ist also definitiv nicht empfehlenswert) oder du setzt den Count explizit hoch, nachdem du ihn ja via Hinzufügen um 1 erhöht hast.
    Sauber finde ich beides nicht. Eigentlich solltest du die ganze Zeit an Objekten im Speicher arbeiten und Datenbankaktivitäten nur am Anfang zum Laden und am Ende zum Persistieren durchführen.

    Deshalb die Frage, ob du von Android kommst. Da geht das blöderweise nicht großartig anders als dauerhaft in der Datenbank zu fuhrwerken.
    «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
  • die Methode sieht so aus

    Quellcode

    1. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    2. {
    3. [database openDB:@"Content"];
    4. countVC = [database getDataWithStmt:@"SELECT MAX(VC) FROM Main"];
    5. [database closeDB];
    6. x = [countVC integerValue];
    7. return x;
    8. }


    MAX(VC) gibt mir an welche der Höchste Eintrag in der Spalte VC ist und genau soviele Rows will ich erzeugen.
  • Du kannst nicht davon ausgehen, dass das Schreiben in die Datenbank (vom Insert) sowie das Lesen aus der Datenbank (beim numbersOfRowInSection) vernünftig nacheinander ablaufen. Mutmaßlich erfolgt der lesende Zugriff auf die Datenbank noch bevor der schreibende Zugriff des Insert abgeschlossen ist.
    «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 McDan. Ich hatte den Datenbank abruf vorher in der ViewDidLoad nun habe ich ihn in die Funktion gepackt und es funktioniert. also war der Aufruf in der ViewDidLoad an der falschen Stelle, so wie Lucas auch sagte.
    ja genau das fange ich jetzt ab erst wenn ein vorgang erfolgreich beendet ist kommt der andere. dann gehts. Danke Lucas