我有一对多的名称匹配和局的映射关系。
match <-->> innings
match
包含字段名称,ID等。innings
包含字段编号。我可以获得match
个属性。我在MatchList
的{{1}}中创建了一个新匹配。我看到表格中提供了TableListController
和Match
的数据。现在,我单击表中创建的行。
但是当我innings
时,我得到[match matchinnings],
。我能够从inningSet获得两个对象inningA和inningB。当我尝试拨打NSSet* inningSet
时,我收到错误。
下面是我的NSFetchResultsController方法:
[inningA number]
在我的班级MatchContextMO中,我收到错误- (NSFetchedResultsController *)fetchedResultsController {
// Set up the fetched results controller if needed.
//NSLog(@"Inside fetchResultsController ");
if (fetchedResultsController == nil) {
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setReturnsObjectsAsFaults:NO];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Match" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"matchinnings"]];
[fetchRequest setIncludesSubentities:YES];
[fetchRequest setResultType:NSManagedObjectResultType];
//[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"matchinnings.number", nil]];
//[fetchRequest valueForKeyPath:@"matchinnings.number"];
//[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"matchinnings", @"number", nil]];
//[fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"matchinnings.number"]];
//[fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"matchinnings", @"matchinnings.number", nil]];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
}
return fetchedResultsController;
}
就行:
EXC_BAD_ACCESS
...在这种方法中:
inningsArray = [newSet allObjects];
我想在最后一周找出答案。它看起来更像CoreData故障。
非常感谢您的帮助。
我尝试迭代返回的集合。在-(NSArray *)determineInningsOrder {
NSArray* array = nil;
NSSet *newSet = [self.match valueForKey:@"matchinnings"];
NSLog(@"Size of set %d", [newSet count]);
NSArray *inningsArray = nil;
@try {
inningsArray = [newSet allObjects];
}
@catch (NSException *exception) {
NSLog(@"Exception in matchinnings %@", [exception reason]);
}
Innings *inningA = [inningsArray objectAtIndex:0];
Innings *inningB = [inningsArray objectAtIndex:1];
if ([inningA isKindOfClass:Innings.class])
NSLog(@"inningA is of type Innings");
Innings* temp;
NSNumber *numberA = [inningA valueForKey:@"number"];
NSLog(@"numberA %d", [numberA intValue]);
if ([numberA intValue] == 2) {
temp = inningA;
inningA = inningB;
inningB = temp;
}
array = [NSArray arrayWithObjects:inningA, inningB, nil];
return array;
}
行上仍然出现'EXC_BAD_ACCESS'错误。虽然NSLog的大小说明了2。
[a addObject:inningsObject]
答案 0 :(得分:1)
当然,如果您将CoreData中的某些内容建模为Integer
并提供自定义类来实现它。该属性是一个对象:NSNumber
。
示例:
·H:
// attributes
@property (nonatomic, retain) NSNumber *version;
// derived attributes
@property (nonatomic, readonly) NSInteger versionIntegerValue;
@property (nonatomic, readonly) NSString *versionStringValue;
的.m:
@dynamic version;
- (NSInteger)versionIntegerValue {
return [self.version integerValue];
}
- (NSString *)versionStringValue {
return [NSString stringWithFormat:@"v%d", [self.version integerValue]];
}
答案 1 :(得分:0)
inningA或inningB的对象类型是什么? 确保:
如果这些都是正确的,请重新格式化您的问题,以便我们更轻松地阅读。
还要更明确地说你在哪里调用底部函数?并提供MatchContectMO的其余部分。我不确定它是什么?这是MO的定义吗?或者是否包含MO? (这个名字一点也不清楚。)
答案 2 :(得分:0)
如果matchinnings
键是多对多关系的名称,那么:
[self.match valueForKey:@"matchinnings"];
...不会返回NSSet而是返回NSMutableSet。当您将它分配给NSSet时:
NSSet *newSet = [self.match valueForKey:@"matchinnings"];
如果您忘记并尝试更改任何内容,它可能会导致问题。
然而,在这种情况下,这可能不是问题。更有可能的是,你根本没有得到一套回归。我确认你得到一个NSMutableSet返回。
我可以告诉你,绝对可以肯定这个问题不是由故障引起的。首先,你明确地没有获取故障,其次,故障不可能导致这种问题。只要访问了一个故障代表对象的属性,就会读入整个对象(用行话中的错误)。故障永远不会触发与属性访问相关的问题。
答案 3 :(得分:0)
您正在使用缓存。这带来了各种各样的问题。我已多次阅读这些文档,但我仍不确定它何时刷新。尝试将缓存更改为nil。可能是缓存中的一个对象不再存储在商店中,并且它正在尝试访问它。
也摆脱这些界限。它们在这个阶段没用,而且你的程序看起来没用:
[fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"matchinnings"]];
[fetchRequest setIncludesSubentities:YES];
[fetchRequest setResultType:NSManagedObjectResultType];
创建了managedObjectContext的位置?它与您运行此代码的线程是否相同?它是否仍有保留计数?试试NSLog(@"MOC Retain count: %i", [managedObjectContext retainCount]);
如果它不在同一个帖子中,请确保它是。它不是线程安全的,如果不是,你会得到这些错误。
你是如何设定比赛的?你的代码并不清楚。 NSFetchedResultsController对于填充表视图很有用,但match是一个属性。怎么设置? NSFetchedResultsController是否使用正确的接口?正常的抓取工作也会起作用吗?
如果这些都不起作用,我认为你最好在这里发布整个文件的内容。正如其他人所说,有什么是正确的,而且很难诊断出我们看不到的东西。
答案 4 :(得分:0)
如果没有更多的实施,这有点难以辨别,但我会看看:
答案 5 :(得分:0)
给出像&#34; number&#34;等属性名称是一个坏主意。或&#34;文字&#34;或者&#34;描述&#34;,除非你故意继承。当您尝试最后一个时,核心数据实际上会发出警告,但它并没有使用所有保留字。来自NSPropertyDescription Class Reference:
请注意,属性名称不能与NSObject或NSManagedObject的任何无参数方法名称相同。例如,您不能为属性指定名称&#34; description&#34;。 NSObject上有数百个可能与属性名称冲突的方法 - 这个列表可以在没有框架或其他库的警告的情况下增长。你应该避免使用非常通用的单词(例如&#34; font“和”color“)以及与Cocoa范例重叠的单词或短语(例如”isEditing“和”objectSpecifier“)。
始终如一地使用valueForKey:
,大部分时间都会绕过此问题,但只要您拨打[inningA number]
之类的电话,就会收到错误。
答案 6 :(得分:0)
当我在包含对象处于故障状态时访问一对多关系count
时,我遇到了同样的问题myObject.oneToManyRelationshipProperty.count; <- EXC_BAD_ACCESS
。
relationshipKeyPathsForPrefetching
这似乎可以通过在获取请求期间设置NSFetchRequest *fetchRequest = ...
fetchRequest.relationshipKeyPathsForPrefetching = @[@"yourProperty"];
来解决,这将预先加载&#34;预加载&#34;初始提取期间的关系对象和不错误。
Uri uri = Uri.parse("imageURL");
对此解决方案的反馈表示赞赏。我不明白为什么我得到了糟糕的访问权限;不应该访问一个故障只是加载对象(而不是崩溃)?