Extra Klasse für sqlite Datenbank

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

  • Extra Klasse für sqlite Datenbank

    Hallo, ich habe in den ganzen Tutorial immer nur die Variante gefunden, dass man sich seinen managedObjectContext,.... und die ganze anderen Sachen die man für die Datenbank benötigt in der jeweiligen Klasse initialisiert.
    Nun habe ich aber eine größere App und möchte globale Funktion haben (+(void)insertNewUser oder +(void)deleteUser).
    Aber da fast alle Funktionen lokal initialisiert wurde, kann ich es nicht einfach global machen.
    Soll ich den Context einfach mit übergeben oder gibt es da eine bessere Alternative.
    Also mein Ziel wäre es eine Klasse zu haben, die ich in jedes Projekt importieren könnte und die globalen Funktionen funktionieren würden ;)
    Gruß Speed
  • Extra Klasse für sqlite Datenbank

    Mich würde auch mal brennend interessieren wieso man eine Methode insertNewUser oder gar deleteUser global verwenden muss? Bei userLevel oder userLoggedin würde ich es ja vielleicht noch verstehen (auch wenn ich es da auch nicht global machen würde)

    Gruss

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • es geht mir darum, dass z.B. im Buch "Apps programmieren für iPhone und iPad" der eine Teil in der AppDelegate deklariert wird und der Rest (NSFetchedResultsController, didChangeSection,didChangeObject, managedObjectContext,.....) wird dann in der verwendeten Klasse deklariert.
    ​Das ist aber recht "viel" Zeug, was ich wenn ich 10 Klassen hätte und überall auf die Datenbank zugreifen möchte, in jeder Klasse haben müsste, was aber im Endeffekt immer gleich ist.
    Deshalb hätte ich gerne eine Klasse, wo ich das ganze reinpacke und dann paar Funktionen habe (mit Parametern), die ich einfach aufrufen muss.
  • SpeedyBrainy schrieb:

    es geht mir darum, dass z.B. im Buch "Apps programmieren für iPhone und iPad" der eine Teil in der AppDelegate deklariert wird und der Rest (NSFetchedResultsController, didChangeSection,didChangeObject, managedObjectContext,.....) wird dann in der verwendeten Klasse deklariert.
    ​Das ist aber recht "viel" Zeug, was ich wenn ich 10 Klassen hätte und überall auf die Datenbank zugreifen möchte, in jeder Klasse haben müsste, was aber im Endeffekt immer gleich ist.
    Deshalb hätte ich gerne eine Klasse, wo ich das ganze reinpacke und dann paar Funktionen habe (mit Parametern), die ich einfach aufrufen muss.


    In der Regel hat ja auch jeder Controller seine Aufgabe. Wenn du in jedem Controller das Gleiche Zeug anzeigst, läuft irgendwas schief ;)

    Du kannst noch Subclass von UITableViewController erstellen und da entsprechend die Methoden überschreiben, aber naja.
  • mir geht es einfach nur um den Zugriff der Datenbank.
    Im Loginscreen will ich auf die Datenbank zugreifen, wo ich die ganzen User Daten benötige.
    Im Screen 2 greife ich auf die Größe des Users zu und im Screen 3 auf das Gewicht (als Beispiel).

    Bedeutet:
    3 verschieden Views aber immer der gleiche Datenbankzugriff!!!!!!!!

    Hat keiner eine Lösung dafür?
  • SpeedyBrainy schrieb:

    mir geht es einfach nur um den Zugriff der Datenbank.
    Im Loginscreen will ich auf die Datenbank zugreifen, wo ich die ganzen User Daten benötige.
    Im Screen 2 greife ich auf die Größe des Users zu und im Screen 3 auf das Gewicht (als Beispiel).

    Bedeutet:
    3 verschieden Views aber immer der gleiche Datenbankzugriff!!!!!!!!

    Hat keiner eine Lösung dafür?


    dann mach doch einen DB-controller.
    den hängst du dann an den app-delegate damit du ihn von überalll abruffen kannst.
    oder du hängst ihn direkt an die controller die ihn verwenden.

    hat auch den vorteil dass du in zukunft vielleicht mehrere instanzen dieses db-controllers haben kannst (multilogin etc...)
  • Für so etwas verwendet man in der Regel Model-Controller, also Klassen mit den gewünschten Funktionen, die die Viewcontroller verwenden können. Ansonsten solltest Du auch noch mal über Christians Vorschlag mit der Kategorie nachdenken. Der ist auch nicht ungeschickt. ;)
    „Meine Komplikation hatte eine Komplikation.“
  • Also in Deinem Fall hätte ich eine Entity User in der seine Attribute drin stehen. Im Login wird der MO zum User geholt und an alle weiteren Views als Property weiter gegeben, denn ab da ändert sich der User ja nicht mehr.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Quellcode

    1. + (void)show {
    2. NSEntityDescription *entitydesc = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:data.context];
    3. NSFetchRequest *request = [[NSFetchRequest alloc]init];
    4. [request setEntity:entitydesc];
    5. [request setPredicate:nil];
    6. NSError *error;
    7. NSArray *mathingData = [context executeFetchRequest:request error:&error];
    8. NSString *firstname;
    9. NSString *lastname;
    10. for (NSManagedObject *obj in mathingData) {
    11. NSLog(@"firstname: %@",[obj valueForKey:@"firstname"]);
    12. NSLog(@"lastname: %@",[obj valueForKey:@"lastname"]); }
    13. }
    Alles anzeigen


    Das ist meine Funktion, die ich gerne aus jeder Klasse aus aufrufen würde.
    Da die Funktion global ist, kann ich aber irgendwie nicht den managedObjectContext verwenden. Das Interface meiner neuen Klasse: @interface data : NSManagedObjectContext
    Aber was mach ich jetzt damit, sodass ich den Kontext nicht in jeder Klasse extra anlegen muss?
  • matz schrieb:

    Den Context hast du i.d.R im AppDelegate und kannst ihn dir da abgreifen

    Und wie?

    Quellcode

    1. ​ AppDelegate *appdelegate = [[UIApplication sharedApplication]delegate];
    2. context = [appdelegate managedObjectContext];

    So habe ich es gemacht, aber das geht nicht. context ist in der Klasse deklariert, aber da die Speicherfunktionen global sein sollen, kann ich darauf nicht zugreifen.
    Soll ich dann den context in der AppDelegate als extern deklarieren?