核心数据仅在我重新启动应用程序时获取

时间:2014-04-05 17:21:08

标签: ios objective-c uitableview core-data

我正在开发一个简单的核心数据应用程序,它可以保存列表的名称。我使用带文本字段的UIAlertView输入数据。我的问题是,当用户输入数据并点击保存时,它不会显示在TableView中。但是当我在那里重新运行它时,它就被创建了。它在TableView中。

所以在这一点上,我很遗憾,我对核心数据非常陌生,所以如果你有任何建议,我会全神贯注。谢谢!

以下是我的TableView.m中的所有核心数据代码:

@implementation ViewController
    - (NSManagedObjectContext *)managedObjectContext {
        NSManagedObjectContext *context = nil;
        id delegate = [[UIApplication sharedApplication] delegate];
        if ([delegate performSelector:@selector(managedObjectContext)]) {
            context = [delegate managedObjectContext];
        }
        return context;
    }

    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];

        // Fetch the devices from persistent data store
        NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"List"];
        self.lists = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];

        [self.tableView reloadData];
    }

-(IBAction)add:(id)sender {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Add List" message:@"Create a New Wish List" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Save", nil];
    [alert setAlertViewStyle:UIAlertViewStylePlainTextInput];
    [alert setTag:2];
    [alert show];
    alert.delegate = self;
}

- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex != 0 && alertView.tag == 2) {
        UITextField *tf = [alertView textFieldAtIndex:0];
        NSManagedObjectContext *context = [self managedObjectContext];

        // Create a new managed object
        NSManagedObject *newList = [NSEntityDescription insertNewObjectForEntityForName:@"List" inManagedObjectContext:context];
        [newList setValue:tf.text forKey:@"name"];

        NSError *error = nil;
        // Save the object to persistent store
        if (![context save:&error]) {
            NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
        }

        [self dismissViewControllerAnimated:YES completion:nil];
    }

    }
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the specified item to be editable.
    return YES;
}


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSManagedObjectContext *context = [self managedObjectContext];

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete object from database
        [context deleteObject:[self.lists objectAtIndex:indexPath.row]];

        NSError *error = nil;
        if (![context save:&error]) {
            NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]);
            return;
        }

        // Remove device from table view
        [self.lists removeObjectAtIndex:indexPath.row];
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}
@end

如果您还需要其他信息,请告诉我们!谢谢!

1 个答案:

答案 0 :(得分:1)

您似乎将表数据存储在名为self.lists的数组中。这意味着,要使您的表显示数据,您需要更新该数组的内容。在创建新条目后,您似乎不会这样做,因为您的提醒视图回调不会更新self.lists的内容。

您似乎没有排序self.lists(至少,您的获取请求中没有排序描述符),因此您可以直接将新条目添加到数组中。它是一个可变数组,所以只需添加新对象即可。然后告诉表视图您添加了一个新行(类似于您在删除条目时当前删除行的方式)。

如果您决定在某个时刻开始对表格进行排序,那么最好从持久性商店更新self.lists。基本上,从viewDidLoad获取代码,从核心数据中获取数据,并在添加(或删除)条目时重复这些步骤。

您可能希望使用NSFetchedResultsController,它旨在简化核心数据与表格视图的组合。