【问题标题】:Exclude duplicate values for NSMutableArray from Coredata entities从 Coredata 实体中排除 NSMutableArray 的重复值
【发布时间】:2014-08-23 21:58:27
【问题描述】:

我有一个方法可以从我的 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,我想知道如何根据entities cNumber 属性从 NSMutablerArray 创建一个唯一值的 NSSet。

这就是我创建 NSMutableArray 的方式

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

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

cNumbers 有 3 个属性

  • numString
  • numID
  • 父对象

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

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

【问题讨论】:

  • 您是否尝试过从该可变数组创建NSSet
  • 不,我现在正试图弄清楚如何做到这一点:) 只是阅读 NSSets 由于 coredata 对象,我遇到了问题
  • 我目前收到警告 Incompatible pointer types initializing 'NSSet *' with an expression of type 'NSString *'
  • 如果你想从你的数据模型中消除重复,为什么你的数据模型允许重复?我认为您在创建新对象时只需使用 numString 检查商店中的现有对象。将一个没有重复的数组混合在一起,只需在 for 循环中使用 NSDictionary 的 setValue:CNumber forKey:numString 直到 tableViewMArray.count,然后调用 NSDictionary 的 allValues。但这忽略了具有相同 numString 的对象可能对其他属性具有不同值的问题......所以你的模型不应该允许它。
  • 这正是其他属性确实具有不同值的问题.. 这是我试图克服 atm 的数据中的错误......真是让人头疼

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


【解决方案1】:

除非我错过了重点,否则这应该对您问题的第一部分有所帮助...

关于你的方法(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


对于您问题的第二部分和更新部分,我很难准确理解您的需求,如果我偏离了标记,请原谅我。

您是否尝试过使用NSPredicate 来设置NSFetchRequest,而不是设置变量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]];

【讨论】:

    【解决方案2】:

    您是否尝试过使用NSMutableSet 而不是NSMutableArray?如果您以一种对ManufacturerNumber 类具有逻辑意义的方式正确实现- (NSUInteger)hash- (BOOL)isEqual:(id)anObject,这应该会给您想要的结果(这是必要的,因为集合使用这些方法来确保每个对象的唯一性。如何您实现这些取决于ManufacturerNumber 类的内部结构)。或者,如果您关心订单但又想保持唯一性,您可以使用NSMutableOrderedSet

    【讨论】:

      猜你喜欢
      • 2013-04-20
      • 1970-01-01
      • 2012-03-26
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      相关资源
      最近更新 更多