12 berichten aan het bekijken - 1 tot 12 (van in totaal 12)
  • Q:
    Bijdrager
    dhuyvetterlevi

    Core Data begrijpen

    Hallo,

    Ik probeer te begrijpen hoe Core Data werkt en aan de hand van de apple template in xCode heb ik volgend schema gemaakt :

    Kan iemand mij vertellen of dit klopt en eventueel iets aan verbeteren?

    Ook ik vraag me af als je in je app delegaten de NSManagedObjectContext doorgeeft aan je viewcontroller en er daar bewerkingen mee doet hoe word alles dan terug opgeslaan in de sqllite database aangezien er in de template enkel word opgeslaan in app delegaten?

    Bijdrager
    dhuyvetterlevi

    Het opslaan ben ik intussen al uit

    Inactief
    Anoniem

    Het plaatje is heel moeilijk te lezen.

    Ik ben benieuwd hoe je het opslaan hebt gedaan.

    Bijdrager
    dhuyvetterlevi

    Als je rechts klikt op het plaatje en openen in niewe tab of venster dan is het groter.

    Ik vond de template van apple nogal veel code voor iets simpels als data opslaan bewerken en verwijderen.

    In elke viewcontroller maak ik een NSManagedObjectContext aan op de volgende manier :

    <br />
    - (NSManagedObjectContext *)managedObjectContext {<br />
    	NSURL *databaseURL = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"coreData.sqlite"];<br />
    	NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"coreData" withExtension:@"momd"]];</p>
    <p>	NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];<br />
    	[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:databaseURL options:nil error:nil];</p>
    <p>	NSManagedObjectContext *returnManagedObjectContext = [[NSManagedObjectContext alloc] init];<br />
    	[returnManagedObjectContext setPersistentStoreCoordinator:persistentStoreCoordinator];</p>
    <p>	return returnManagedObjectContext;<br />
    }<br />
     

    Voorlopig om het simpel the houden maak ik nog geen gebruik van NSFetchedResultsController en probeer ik een nieuw NSManagedObject op te slaan in mijn context en die dan naar de database weg te schrijven :

    <br />
    NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"Applications" inManagedObjectContext:[self managedObjectContext]];<br />
    	[newManagedObject setValue:@"Test" forKey:@"company"];<br />
    	[[self managedObjectContext] save:nil];<br />
     

    helaas als ik de sqlite file open in navicat zie ik dat er niets is bijgekomen:(

    Inactief
    Anoniem

    Allereerst: OMT kan nog steeds niet omgaan met source code :thumbsdown::thumbsdown::thumbsdown:

    Waarom heb je een MOC voor elke VC? Ik zou gewoon 1 MOC voor je app gebuiken, en die delen met elke VC. Hoofdstuk 31 in Hillegass’ Cocoa boek (4e ed) beschrijft hoe je dit kunt doen.

    Bijdrager
    Verwijder

    In het plaatje ontbreekt NSPersistentStore en het bestand is niet class NSURL. Wat geven de pijlen aan? Messages, argumenten, datastromen of hoe alles aan elkaar vast zit? In alle gevallen klopt het niet. Zie Core Data als een zwarte doos, volg de gebruiksaanwijzing en doe geen aannames.

    Ik heb de documentatie van Core Data meerdere malen door moeten lezen voor ik het een beetje begreep. Begin nog eens overnieuw met lezen want volgens mij maak je het veel te ingewikkeld. Lees vooral:Getting a Managed Object Context. Als je elke view controller een eigen context geeft dan zie je wijzigingen in de één niet terug bij de rest.

    Maak in Xcode eens een nieuw project met Core Data en kijk hoe dat in elkaar steekt.

    Ik vond de template van apple nogal veel code voor iets simpels als data opslaan bewerken en verwijderen.

    Dat is niet voor niks. Ga op die manier verder. Mijn ervaring is dat ik daar pas dingen aan moet gaan veranderen als ik helemaal begrijp wat ik aan het doen ben. En als ik het helemaal begrijp dan besef ik dat ik er niets aan hoef te veranderen.

    Inactief
    Anoniem

    Zet ook eens wat NSLog calls in je code om te kijken of je objecten en entities daadwerkelijk worden gegenereerd. Of kijk naar de NSError in de save: call. Ik zou daar zeker geen nil als argument gebruiken.

    Bijdrager
    Verwijder

    Je kan er ook breaks in zetten en kijken wat er gebeurt.
    Controleer altijd wat een method teruggeeft, bijvoorbeeld addPersistentStoreWithType en save.

    Nog een probleem: elke keer dat je [self managedObjectContext] doet maak je een nieuwe persistent store, coordinator en context aan. Je maakt een managed object met een nieuwe context en zegt dan save tegen een andere nieuwe (lege) context.

    Bijdrager
    dhuyvetterlevi

    Bedankt voor de antwoorden iedereen. Ik heb m’n MOC nu in m’n app delegate gezet en heb een nsobject aangemaakt om objecten op te slaan die ik ergens anders wil gebruiken en op die manier geef ik de MOC door aan een viewcontroller.

    Inactief
    Anoniem

    Je kunt ook een NSArrayController gebruiken ipv een NSObject om je objecten in op te slaan.

    Bijdrager
    Verwijder

    Koen, maak Levi nou niet in de war:wink:
    NSFetchedResultsController is er alleen onder iOS, NSArrayController alleen onder OS X. Controllers zijn niet om objecten op te slaan, daarvoor zijn er collections (NSArray, NSSet, NSDictionary enz.).

    Van “heb een nsobject aangemaakt om objecten op te slaan die ik ergens anders wil gebruiken en op die manier geef ik de MOC door aan een viewcontroller” krijg ik het gevoel dat er iets nog niet goed zit.

    Inactief
    Anoniem

    Bedankt voor de correctie :thumbsup:

12 berichten aan het bekijken - 1 tot 12 (van in totaal 12)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.