I have check the following Q&A and while the solutions are much the same the issue remains for me remains: Saving an updated Core Data instance
Update/Edit coreData managed object
How to update existing object in Core Data?
I have a log in/log out feature in my app.
The Core Data entity "NewLog" has the following attributes
String loginTime
String logoutTime
String loginStatus
String name
When I login it creates a new object in the core data. When I log out I have the object update.The issue is when I logout it updates the existing object but creates a new object also.
Here is my "save" code from my super class so that I don't have to continuously rewrite it and risk errors in my classes:
- (void) saveAndDismiss{
NSError * error = nil;
if ([self.managedObjectContext hasChanges]){
if (![self.managedObjectContext save: &error]){
NSLog(@"Save Failed: %@", [error localizedDescription]);
}
else {
NSLog(@"Save Successful");
}
}
[self dismissViewControllerAnimated:YES completion:nil];
}
In my loginViewController implementation file to update the "loginStatus" and "logoutTime":
- (IBAction)logOutButton:(id)sender {
//access the managed object context and create a shortcut name
NSManagedObjectContext *context = [self managedObjectContext];
//refer to the entity in the core data
NSEntityDescription *entity = [NSEntityDescription entityForName: @"NewLog" inManagedObjectContext:context];
//create a request
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity: entity];
// Results should be in descending order of loginTime.
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"loginTime" ascending:NO];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
//create an array of results
NSArray *results = [context executeFetchRequest:request error:NULL];
NewLog *latestEntity = [results objectAtIndex:0];
//refer to the specific value that I wish to change
NSString * statusOfLogin = latestEntity.loginStatus;
//if the loginStatus in my app is currently YES
if ([statusOfLogin isEqual:@"YES"]){
//create a date formatter
NSDateFormatter *dateformatter=[[NSDateFormatter alloc]init];
//format as such
[dateformatter setDateFormat:@"dd MMM yyyy , HH:mm:ss"];
//convert to a string
NSString *dateInStringFormated=[dateformatter stringFromDate:[NSDate date]];
//hide logout button and display login button
_logOutButton.alpha = 0.0;
_loginButtonStatus.alpha = 1.0;
//status declared as String in .h file
status = @"NO";
//update the object found in "latestEntity"
latestEntity.logoutTime = dateInStringFormated;
//set the login status to be NO
latestEntity.loginStatus = status;
//BOOL declared in the .h file
logStatus = false;
self.loginLabel.text = @"Logged Out";
self.dateLabel.text = dateInStringFormated;
[super saveAndDismiss];
}
}
When I save the updated data it creates a new object containing only the logoutTime and loginStatus.
Is there a solution to stop the new object being created?
Thanks
EDIT
I know that it is creating a new object the following ways: 1. The SQL file displays the new object with the content stated above - logoutTime and loginStatus 2. The tableview displays the new object and in the detail view for it displays the two items.
Checking the area it's coming from is my segue:
//prepare for segue
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
//first check whether the segue is equal to our transition name
if([[segue identifier]isEqualToString:@"loginSegue"])
{
//tell the segue where to go
UINavigationController *navigationController = segue.destinationViewController;
//create reference to view controller
LoginViewController *loginVC= (LoginViewController*) navigationController.topViewController;
//create the new object
NewLog *addLogDetails = [NSEntityDescription insertNewObjectForEntityForName:@"NewLog" inManagedObjectContext: [self managedObjectContext]];
loginVC.logEntry = addLogDetails;
}
}
I know why it's creating a new object but how do I prevent this from happening while remaining able to save?