更改更新核心数据属性的删除方法

Posted

技术标签:

【中文标题】更改更新核心数据属性的删除方法【英文标题】:Change deleting method for updating core data attribute 【发布时间】:2013-12-19 18:58:02 【问题描述】:

过了一会儿,我现在可以在对选定行进行长按操作后从表视图中删除核心数据记录。根据我的应用程序要求,我不想永久删除记录,我只想将记录标记为已删除,因此我创建了一个名为 ToDoStatus 的属性,我想对其进行更新并将其内容更改为“标记为已删除” ' 当用户在所选行上执行长按操作时。 在这里,您拥有现在的代码(永久删除该行)。 恳请您告诉我如何更改 handleLongPress 方法中属性内容的值:

#import "RootViewController.h"
#import "AddToDoViewController.h"
#import "EditToDoViewController.h"
#import "MenuViewController.h"



@interface RootViewController ()
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath;
@end


@implementation RootViewController

@synthesize fetchedResultsController, managedObjectContext,AddToDoButton,MenuToDoButton;


#pragma mark -
#pragma mark View lifecycle

- (void)viewDidLoad 

  [super viewDidLoad];
//  [self setTitle:@"Today"];
  [[self navigationItem] setRightBarButtonItem:[self editButtonItem]];
    self.editButtonItem.tintColor = [UIColor redColor];

    UILabel *lblTitle = [[UILabel alloc] init];
    lblTitle.text = @"Today";
    lblTitle.backgroundColor = [UIColor clearColor];
    lblTitle.textColor = [UIColor blueColor];
    lblTitle.shadowColor = [UIColor whiteColor];
    lblTitle.shadowOffset = CGSizeMake(0, 1);
    lblTitle.font = [UIFont fontWithName:@"Noteworthy" size:25.0];
    [lblTitle sizeToFit];

    self.navigationItem.titleView = lblTitle;



    [self.editButtonItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                     [UIFont fontWithName:@"Noteworthy" size:20], NSFontAttributeName,
                                     [UIColor blueColor], NSForegroundColorAttributeName,
                                     nil]
                           forState:UIControlStateNormal];







    self.tableView.delegate = self;
    self.tableView.dataSource = self;


  NSError *error = nil;
  if (![[self fetchedResultsController] performFetch:&error])
  
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
  

- (void) viewWillAppear:(BOOL)animated
    NSError *error = nil;
    if (![[self fetchedResultsController] performFetch:&error])
    
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    
    [self.tableView reloadData];

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath

  NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:indexPath];





  [[cell textLabel] setText:[[managedObject valueForKey:@"estado"] description]];
  NSString *myString = [NSString stringWithFormat:@"%@",[[managedObject valueForKey:@"todoYear"] description]];
    UIButton *urgentButton = [[UIButton alloc]initWithFrame:CGRectMake(15, 25, 18, 18)];

    [urgentButton setImage:[UIImage imageNamed:@"urgent"]forState:UIControlStateNormal];
    [cell addSubview:urgentButton];

    UIButton *yellowButton = [[UIButton alloc]initWithFrame:CGRectMake(305, 5, 10, 40)];

    [yellowButton setImage:[UIImage imageNamed:@"Red"]forState:UIControlStateNormal];
    [cell addSubview:yellowButton];

    UIButton *doneButton = [[UIButton alloc]initWithFrame:CGRectMake(33, 27, 18, 18)];

    [doneButton setImage:[UIImage imageNamed:@"alldone"]forState:UIControlStateNormal];
    [cell addSubview:doneButton];

    UIButton *doneButton2 = [[UIButton alloc]initWithFrame:CGRectMake(53, 27, 18, 18)];

    [doneButton2 setImage:[UIImage imageNamed:@"alldone"]forState:UIControlStateNormal];
    [cell addSubview:doneButton2];



    UIButton *doneButton3 = [[UIButton alloc]initWithFrame:CGRectMake(71, 27, 18, 18)];

    [doneButton3 setImage:[UIImage imageNamed:@"urgent"]forState:UIControlStateNormal];
    [cell addSubview:doneButton3];


    [[cell detailTextLabel] setText:@"  "];
  [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    cell.textLabel.textColor = [UIColor blueColor];
    cell.textLabel.font = [UIFont fontWithName:@"Noteworthy" size:22.0f];
    cell.detailTextLabel.font = [UIFont fontWithName:@"Noteworthy" size:15.0f];



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 


    EditToDoViewController *detailViewController = [[EditToDoViewController alloc] initWithNibName:@"EditToDoViewController" bundle:nil];
    NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    detailViewController.selectedObject = selectedObject;
    //[self.navigationController pushViewController:detailViewController animated:YES];

    [self presentViewController:detailViewController animated:YES completion:nil];





#pragma mark -
#pragma mark Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

  return [[fetchedResultsController sections] count];


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

  id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
  return [sectionInfo numberOfObjects];




- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

  static NSString *CellIdentifier = @"Cell";

  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil)
  
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
                                   reuseIdentifier:@"Cell"] autorelease];
  

    //long press

    UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]
                                          initWithTarget:self action:@selector(handleLongPress:)];
    lpgr.minimumPressDuration = 1.00;
    //seconds
    [cell addGestureRecognizer:lpgr];




  [self configureCell:cell atIndexPath:indexPath];

  return cell;



-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer

    CGPoint p = [gestureRecognizer locationInView:self.tableView];

    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
    if (indexPath == nil)
        NSLog(@"long press on table view but not on a row");
    else
    

        if (gestureRecognizer.state == UIGestureRecognizerStateEnded) 
            NSLog(@"UIGestureRecognizerStateEnded");
            //Do Whatever You want on End of Gesture
        
        else if (gestureRecognizer.state == UIGestureRecognizerStateBegan)
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Announcement" message: @"You have long-pressed the row...!" delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alert show];
            [alert release];
            NSLog(@"UIGestureRecognizerStateBegan.");


            NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
            [context deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];
            NSLog(@"long press on table view at row %d", indexPath.row);

            // Update ToDoStatus
            NSError *error1 = nil;
            if (![[self fetchedResultsController] performFetch:&error1])
            
                NSLog(@"Unresolved error %@, %@", error1, [error1 userInfo]);
                abort();
            
            NSError *error = nil;
            if (![context save:&error])
            
                NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
                abort();
            
            [self.tableView reloadData];
            //Do Whatever You want on Began of Gesture
        

    

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

  if (editingStyle == UITableViewCellEditingStyleDelete)
  
    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
    [context deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];

    NSError *error = nil;
    if (![context save:&error])
    
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
      abort();
    
      NSError *error1 = nil;
      if (![[self fetchedResultsController] performFetch:&error1])
      
          NSLog(@"Unresolved error %@, %@", error1, [error userInfo]);
          abort();
      
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"To-Do Deleted" message: @"You have marked To-Do as deleted...!" delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
      [alert show];
      [alert release];
      [self.tableView reloadData];
     


- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath

  return YES;


- (void)tableView:(UITableView *)tableView 
moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath 
      toIndexPath:(NSIndexPath *)destinationIndexPath;
  
  NSMutableArray *things = [[fetchedResultsController fetchedObjects] mutableCopy];

  // Grab the item we're moving.
  NSManagedObject *thing = [[self fetchedResultsController] objectAtIndexPath:sourceIndexPath];

  // Remove the object we're moving from the array.
  [things removeObject:thing];
  // Now re-insert it at the destination.
  [things insertObject:thing atIndex:[destinationIndexPath row]];

  // All of the objects are now in their correct order. Update each
  // object's displayOrder field by iterating through the array.
  int i = 0;
  for (NSManagedObject *mo in things)
  
    [mo setValue:[NSNumber numberWithInt:i++] forKey:@"displayOrder"];
  

  [things release], things = nil;

  [managedObjectContext save:nil];







#pragma mark -
#pragma mark Fetched results controller
- (IBAction)AddToDoAction:(id)sender 

    AddToDoViewController *viewController = [[AddToDoViewController alloc] init];
    [self presentViewController:viewController animated:YES completion:nil];


#pragma mark Fetched results controller
- (IBAction)MenuToDoAction:(id)sender 

    MenuViewController *viewController = [[MenuViewController alloc] init];
    [self presentViewController:viewController animated:YES completion:nil];



- (NSFetchedResultsController *)fetchedResultsController

  if (fetchedResultsController) return fetchedResultsController;

  NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
  NSEntityDescription *entity = 
               [NSEntityDescription entityForName:@"FavoriteThing" 
                           inManagedObjectContext:managedObjectContext];

  [fetchRequest setEntity:entity];

  NSSortDescriptor *sortDescriptor = 
              [[NSSortDescriptor alloc] initWithKey:@"displayOrder" 
                                          ascending:YES];

  NSArray *sortDescriptors = [[NSArray alloc] 
                              initWithObjects:sortDescriptor, nil];



    NSNumber *yearBuscado = @2013;
    NSNumber *mesBuscado = @12;
    NSNumber *diaBuscado = @13;
    NSString *tipourgente = @"Urgent";
    NSString *tipocolor = @"Yellow";
    NSPredicate *yearPredicate = [NSPredicate predicateWithFormat:@"todoYear == %@", yearBuscado];
    NSPredicate *monthPredicate = [NSPredicate predicateWithFormat:@"todoMonth == %@", mesBuscado];
    NSPredicate *dayPredicate = [NSPredicate predicateWithFormat:@"todoDay == %@", diaBuscado];
    NSPredicate *urgentPredicate = [NSPredicate predicateWithFormat:@"urgent == %@", tipourgente];
    NSPredicate *colorPredicate = [NSPredicate predicateWithFormat:@"color == %@", tipocolor];

  [fetchRequest setSortDescriptors:sortDescriptors];






  NSPredicate *busqueda = [NSCompoundPredicate andPredicateWithSubpredicates:@[yearPredicate, monthPredicate,dayPredicate,urgentPredicate]];

    [fetchRequest setPredicate:busqueda];
  NSFetchedResultsController *aFetchedResultsController =
              [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                                  managedObjectContext:managedObjectContext
                                                    sectionNameKeyPath:nil cacheName:nil];
  aFetchedResultsController.delegate = self;
  [self setFetchedResultsController:aFetchedResultsController];


  [aFetchedResultsController release];
  [fetchRequest release];
  [sortDescriptor release];
  [sortDescriptors release];


  return fetchedResultsController;
    

- (void)dealloc 
  [fetchedResultsController release];
  [managedObjectContext release];


  [super dealloc];



@end

【问题讨论】:

这就像更改任何对象的任何属性值一样。你不明白哪一部分? [[fetchedResultsController objectAtIndexPath:indexPath] setValue:@"Gone" forKey:@"ToDoStatus"] 那是@Wain,谢谢... @Wain,您介意将您的提案作为我问题的答案发布,以便我接受吗? 【参考方案1】:

您当前拥有deleteObject: 的位置,替换为:

[[fetchedResultsController objectAtIndexPath:indexPath] setValue:@"Gone" forKey:@"ToDoStatus"]

仅此而已。

【讨论】:

以上是关于更改更新核心数据属性的删除方法的主要内容,如果未能解决你的问题,请参考以下文章

核心数据对象在其相关对象的属性更改时更新

核心数据 - 更改属性类型

使用 NSFetchedResultsController 的核心数据:更改后更新数据

更改未保存在核心数据模型中(例如删除对象)

实体名称更改时核心数据建模器不更新

强制核心数据更新模型