1

我有一个简单的应用程序,具有以下前提和一些小问题:

  • 我有 4 个选项卡,每个选项卡都有一个显示不同信息的表格视图,每个选项卡都有一个加号按钮,以模态方式连接到同一个视图控制器,允许用户向应用程序添加信息。
  • 用户在视图控制器中添加名称、标题、日期和金额,当他们按下保存时,它会保存到核心数据表视图中。

第一个选项卡在带有标签等的自定义表格单元格中显示上述所有信息(名称、标题、日期、金额)。效果很好。

第二个选项卡仅显示有关名称的信息,第三个选项卡仅显示标题。这样,用户可以看到第一个选项卡中的所有内容,但只能看到第二个选项卡中的“名称”,他们可以选择收集有关该名称的信息。

当每个名称(或日期或标题)只有一个条目时,该应用程序运行良好,但当我添加第二个条目时,它会在“名称”选项卡中重复。

例如,如果我有一个 John Smith 的条目,只有一个条目,它会在 Name 选项卡中显示一个条目,当我进入时,它只显示附有 John 姓名的交易(这里的 1案子)。都好。

但是,如果我为 John 添加另一个条目(拼写完全相同),它会将其视为单独的条目,并且突然间,名称选项卡现在有 2 个约翰。

我没有在核心数据模型的属性中放置任何唯一 ID,但是我必须这样做吗,或者我可以使用谓词在名称选项卡中询问“如果它已经存在,不要显示两次”酒吧?

任何帮助将不胜感激!

编辑:

这是 Name 选项卡的 fetchRequest:

- (NSFetchedResultsController *)fetchedResultsController
{
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    if (_fetchedResultsController != nil)
    {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext];
    fetchRequest.entity = entity;
    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"whoBy.name" ascending:NO];
    fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];    
    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController;
}

正如我们所见,没有谓词或类似的东西。我想要的是一个简单的检查来查看“如果名称存在,不要将它添加两次”到名称表视图。我希望这是有道理的?

4

2 回答 2

1

该条目重复,因为在Names选项卡中您正在查询Transactions表,然后获取进行该交易的人的姓名。因为 John 有两笔交易,所以您两次得到他的名字。

尝试这样的事情:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:managedObjectContext];
fetchRequest.entity = entity;
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];

像这样,您应该只获取每个名称(人)一次(假设名称和事务之间的关系是一对多的)。

编辑:每次创建 时Transaction,都会发生两件事Person

  • 它可以是一个新Person的,你应该创建一个新的实体;或者,
  • 这是一个新的Person

逻辑是这样的,你必须弄清楚代码:

  1. 当用户添加 aTransaction时,您需要检查它是给新人的还是现有的 - 如果是现有的,也许他可以从列表中选择它Persons(当他选择一个人时,你会得到它NSManagedObjectID)。如果是新的,您可以在现场创建它。

  2. 创建Transaction对象后,您需要将Person对象添加到其关系中。如果我没看错,你在对象中有whoBy关系。Transaction将其设置为Person您在步骤 1 中获得的对象。

  3. 设置对象的所有其他字段Transaction(金额等)。

  4. NSManagedObjectContext完成所有这些后保存。

您目前在代码中所做的是为 each 创建一个新PersonTransaction,这就是为什么您会看到多个同名条目的原因。

于 2013-11-15T09:30:34.973 回答
1

是的,您可以通过设置告诉 CoreData 您只需要不同的值:

NSFetchRequest *request;
request.propertiesToFetch = [NSArray arrayWithObject:@"Name"];
request.returnsDistinctResults = YES;
request.resultType = NSDictionaryResultType;
...

但是,如果您不希望数据库中有 2 个约翰,那么最好不要将它们放在那里而不是过滤结果。因此,当您插入数据时,请检查您是否已经拥有该条目,如果您没有插入它(您可以只更新该记录)......

于 2013-11-15T09:37:48.967 回答