使用表视图编辑核心数据内部单个属性的正确方法

时间:2013-12-11 17:14:37

标签: ios objective-c core-data uitableview nsfetchedresultscontroller

我有一个简单的应用程序,它包含一个表视图和一个加号按钮,供用户以模态方式转到另一个视图控制器,在文本字段中添加一些文本并保存。

将其保存在后端意味着保存到Core Data,然后使用NSFetchedResultsController将其显示给表视图控制器。

模型是:

交易实体 日期实体 场合实体 人员实体

交易实体与其他实体有关系,因此Person的NAME属性为whoFrom.name。

一切都适用于添加新条目,但在编辑方面我很困惑。我点击一个单元格并通过prepareForSegue,视图控制器中的信息得到了设置。名称文本字段具有输入的名称,事件文本字段具有输入的名称。

我希望能够干净地编辑它。

因此,如果用户将名称文本字段从Jack更改为Bill,我希望它仅更改为此单元格而不更改每个插孔到帐单。

因此应遵循以下逻辑:

  • 将名称从杰克改为比尔
    • 如果Bill存在,请将其返回并将此交易添加到Bill的交易中
    • 如果Bill不存在,请创建它。
    • 如果Jack只有一笔交易并且我将Jack重命名为Bill,请确保从Core Data中删除“Jack”。

在保存新条目时,我已经将代码设置为1和2。

NSManagedObjectContext *context = [self managedObjectContext];
Transaction *transaction = [NSEntityDescription insertNewObjectForEntityForName:@"Transaction" inManagedObjectContext:context];

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

personWithName是Person NSManagedObjectSubclass上的一个类别:

+ (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; 
}

我一直在阅读教程并考虑如何在我的编辑视图控制器的“保存”方法中执行此操作,或者通常调用详细视图控制器,但我无法弄清楚如何使其工作。

通过编辑,我不想创建新的事务,我想获取THAT事务的信息,更改名称或事件并再次保存。所以我无法想象我会将insertNewObject放入DetailViewController的save方法中。

我是否指定了newName和oldName,我是否更新了transaction.whoBy等?

我真的迷失了这个,所以任何朝着正确方向的努力都会非常有帮助;我知道我很接近因为我上面用于添加新条目的保存方法已成功返回用户的逻辑(如果他存在)或创建一个用户(如果他不存在)。

谢谢,

1 个答案:

答案 0 :(得分:1)

实际上非常简单。您的人员实例存在或不存在。如果是,则向用户显示一个列表,供他选择要编辑的人员。如果是新人,请允许用户明确创建新人。

如果用户尝试创建名称已存在的新人,请询问用户该怎么做。

从视图控制器的角度来看,这很容易。您可以使用同一个控制器进行编辑和创建。只需给它@property类型Person,然后只需更改属性,例如名称。如果是编辑,则指定所选人员,如果不创建并分配。如果是新的并且用户取消,则删除该对象。