编辑核心数据表视图条目覆盖现有条目而不是创建新条目

时间:2013-11-28 18:04:55

标签: ios iphone objective-c core-data editing

我有一个基于Core Data的应用程序,带有一个表视图控制器;用户按下导航栏中的加号按钮,它们以模态方式被带到视图控制器,在那里他们可以将信息输入到文本字段中。按“保存”按钮可保存此信息Core Data并将其显示在“表”视图中。

我已经配置了应用程序,这样当我点击一个单元格时,我就会进入一个成功传递信息的视图。

我想要实现的是重命名文本字段(例如,名称)并按Core Data中的Save updates THAT属性,而不是创建一个具有相同名称并保留旧名称的全新属性。

编辑视图控制器中的我的保存方法是:

- (IBAction)save:(id)sender
{
    NSManagedObjectContext *context = [self managedObjectContext];
    Transaction *transaction = [NSEntityDescription insertNewObjectForEntityForName:@"Transaction" inManagedObjectContext:context];
    Item *itemType = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:context];

    Person *enteredPerson = (Person *)[Person personWithName:self.editingNameTextField.text inManagedObjectContext:context];
    transaction.whoBy = enteredPerson;

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

哪个电话:

+ (Person *)personWithName:(NSString *)name inManagedObjectContext:(NSManagedObjectContext *)context
{
    Person *person = nil;

    // Creating a fetch request to check whether the name of the person already exists
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
    request.predicate = [NSPredicate predicateWithFormat:@"name = %@", name];
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

    NSError *error = nil;
    NSArray *people = [context executeFetchRequest:request error:&error];
    if (!people)
    {
        // Handle Error
    }
    else if (![people count])
    {
        // If the person count is 0 then let's create it
        person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
        person.name = name;
    }
    else
    {
        // If the object exists, just return the last object .
        person = [people lastObject];
    }
    return person; 

    /*
    for (Person *info in people)
    {
        NSLog(@"Names are: %@", person.name);
    }

     */
}

所以,当我点击Jack的一个单元格时,它会向我显示Jack的所有信息。我想将Jack重命名为Jackie并更新Core Data for ALL“Jackie的交易”,但要覆盖Jack对象,而不是保留它并创建另一个名为Jackie。

对此有任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

要重命名某人,您只需要获取该对象(使用旧名称)然后 更新名称属性。例如:

Person *person = [Person personWithName:oldName inManagedObjectContext:context];
person.name = newName;

所有与其他对象的关系(如交易等)都不会被修改。

相关问题