从Coredata实体中排除NSMutableArray的重复值

时间:2014-07-02 23:06:59

标签: ios objective-c entity-framework core-data

我有一个从CoreData数据库返回实体的NSMutableArray的方法。实体看起来像这样

@property (nonatomic, retain) NSNumber * iD;
@property (nonatomic, retain) NSString * number;
@property (nonatomic, retain) ManufacturerNumber *manufacturerNumber;

我需要根据NSString编号创建一个唯一的manufacturerNumber实体数组。

这就是我的方法返回带有重复项的当前数组的方式。

- (NSMutableArray *)readNumber
{
    NSManagedObjectContext *context = [self managedObjectContext];

    // Test listing all FailedBankInfos from the store
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"ManufacturerNumber" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];

    NSError *error;

    NSMutableArray *manufacturerNumbersDictionaryArray = [[NSMutableArray alloc] init];

    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
    for (ManufacturerNumber *manufacturerNumber in fetchedObjects) {

        [manufacturerNumbersDictionaryArray addObject:manufacturerNumber];

    }
    return manufacturerNumbersDictionaryArray;
}

这将返回包含重复项的NSMutableArray,并且我想删除重复项。

更新问题

我现在决定在我的UITableview中显示值时编辑数组,下面我将解释数组包含的内容等。

我有一个包含上述coredata实体的NSMutableArray,我想知道如何根据实体cNumber属性从NSMutablerArray创建一个唯一值的NSSet。

这就是我创建NSMutableArray

的方法
tableViewMArray = [NSMutableArray arrayWithArray:[cardManufacturerNumber.cNumbers allObjects]];

如您所见 cardManufacturerNumber 是一个与 cNumbers 有一对多关系的coredata对象。

cNumbers有3个属性

  • numString
  • numID
  • parentObj

我想知道如何根据cNumbers numString属性创建一个唯一的NSMutableArray。

NSMutableArray应该包含唯一的cNumbers coredata对象。不仅仅是numString字符串,因为我需要知道其他值。

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用NSMutableSet代替NSMutableArray?如果以对- (NSUInteger)hash类具有逻辑意义的方式正确实施- (BOOL)isEqual:(id)anObjectManufacturerNumber,则应该为您提供所需的结果(这是必要的,因为集合使用这些方法来确保每个对象的唯一性。如何实现这些取决于ManufacturerNumber类的内部。或者,如果您关心订单但希望保持唯一性,则可以使用NSMutableOrderedSet

答案 1 :(得分:0)

除非我忽略了这一点,否则这对你问题的第一部分应该有所帮助......

关于您的方法(NSMutableArray *)readNumber,请尝试这样做......

- (NSSet *)readNumber
{
    NSSet *setReturned = nil;

    NSManagedObjectContext *context = [self managedObjectContext];

    // Test listing all FailedBankInfos from the store
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"ManufacturerNumber" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];

    NSError *error;

    NSMutableArray *manufacturerNumbersDictionaryArray = [[NSMutableArray alloc] init];

    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
    for (ManufacturerNumber *manufacturerNumber in fetchedObjects) {

        [manufacturerNumbersDictionaryArray addObject:manufacturerNumber];

    }
    setReturned = [NSSet setWithArray: manufacturerNumbersDictionaryArray];

    return setReturned;
}

这应该返回一组manufacturerNumber而不重复。


对于你问题的第二部分和更新部分,我很难准确理解你的需要,所以请原谅我,如果我不合适的话。

您是否尝试使用NSFetchRequest NSPredicate,而不是设置变量tableViewMArray

例如......

NSString *key = @"cNumbers";

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"cNumber"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K != %d", key, cardManufacturerNumber.cNumbers];
[fetchRequest setPredicate:predicate];
NSArray *array = [<<insert local managedObjectContext>> executeFetchRequest:fetchRequest error:nil];
NSSet *set = [NSSet setWithArray:array];

然后使数组变得可变......

(感谢这个SO Q&A

NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[set allObjects]];