我有一个从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个属性
我想知道如何根据cNumbers numString属性创建一个唯一的NSMutableArray。
NSMutableArray应该包含唯一的cNumbers coredata对象。不仅仅是numString字符串,因为我需要知道其他值。
答案 0 :(得分:0)
您是否尝试过使用NSMutableSet
代替NSMutableArray
?如果以对- (NSUInteger)hash
类具有逻辑意义的方式正确实施- (BOOL)isEqual:(id)anObject
和ManufacturerNumber
,则应该为您提供所需的结果(这是必要的,因为集合使用这些方法来确保每个对象的唯一性。如何实现这些取决于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]];