2009-07-22 3 views
4

저는 요리법을 표시하는 coredata 기반 iPhone 앱을 작성하고 있습니다. 성능을 향상시키기 위해 TableView에 표시 할 때 일괄 처리 (-setFetchBatchSize :)를 사용하고 "name"특성 (-setPropertiesToFetch :) 만 가져 오려고합니다. 둘 다 켜면 작동하지 않으며 목록이 비어 있습니다. 아래 코드에 표시된 행 중 하나를 주석 처리하면 바로 작동합니다.iPhone에서 Coredata, setFetchBatchSize 및 setPropertiesTo를 하나의 요청으로 가져 오기

무엇이 여기에 있습니까? 둘 다 가질 수 없습니까?

NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Rezept" inManagedObjectContext:chk_context]]; 
// *snip* 

//BATCHING 
[fetchRequest setFetchBatchSize:25]; 

NSDictionary *entityProperties = [[NSEntityDescription entityForName:@"Rezept" inManagedObjectContext:chk_context] propertiesByName]; 

//PROPERTIES 
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"name"]]]; 

답변

0

업데이트 : ". NSUnderlyingException는 데이터베이스가 손상이 나타납니다 = (잘못된 기본 키);"내가

[fetchedResultsController performFetch:&error]; 

내가 얻을 후 오류를 NSLog합니다. 그러나 나는 그것이 의미하는 것과 그것이 두 가지 방법 모두를 가능하게하는 것과 어떤 관계가 있는지 알지 못합니다.

2

CoreData에서 버그를 발견 한 것처럼 보입니다. SQL 로깅을 켜서 확실하게 확인할 수 있습니다. 두 옵션을 모두 켜면 약간 잘못된 SQL이 생성됩니다.

사용하려는 옵션은 "com.apple.CoreData.SQLDebug 1"입니다. 명령 줄에서이 옵션을 지정하거나 프로그램의 기본값을 설정할 수 있습니다.

-Wil

+0

CoreData 디버그 프레임 워크는 바탕 화면에서만 작동합니다. 아니요? 나는 아이폰 버전의 디버그 프레임 워크가 있다고 생각하지 않았다. – Hunter

+0

저는 디버그 프레임 워크에 대해 말하는 것이 아닙니다. 환경 변수를 설정하거나 기본 CoreData 프레임 워크에서 추가 로깅을 트리거하도록 기본값을 설정합니다. –

+0

윌, 실제로 전화로 작업하니? 나는 운이 없었고,이 사람은 그것이 알려진 버그라고 제안합니다 : http://stackoverflow.com/questions/822906/how-do-i-get-the-coredata-debug-argument-to-output-to - 콘솔 –

0

헌터 당신은 전화 com.apple.CoreData.SQLDebug 1을 사용하지만 핵심 데이터 전문가에서 멀리 오전 시뮬레이터

+0

답글이나 나쁜 스타일로 댓글을 위장해서는 안됩니다. – Till

4

를 사용하지 않는,하지만 난이 성공적으로 작동있어 수 내 상황에서. 나는 setFetchBatchSize와 setPropertiesToFetch 사이의 "충돌"이 핵심 데이터가 작동하는 방법과 버그 당이 아닌 방법의 부작용이라고 생각한다.

필자는 두 번의 가져 오기를 수행했다. 첫 번째에서는 결과 형식이 NSManagedObjectResultType으로 설정되었고 setFetchBatchSize를 사용하여 메모리로 가져온 데이터의 양을 제한했습니다. 두 번째 가져 오기에서는 단일 속성을 기반으로하는 제목 배열을 채우고 결과 유형을 NSDictionaryResultType 및 fetchBatchSize를 0 (무제한)으로 설정합니다.

테스트에 따르면이 시나리오는 완벽하게 작동합니다. 초기 페치 (실제 managedObjects 포함)의 모든 레코드는 fetchBatchSize에 의해 오류가 발생하고 메모리가 제한됩니다. 두 번째 가져 오기는 간단한 제목 사전을 반환합니다. title 속성에 액세스하기 위해 모든 실제 managedObject를 반복하는 것보다 훨씬 적은 메모리를 사용합니다. 완전히 채워진 사전을 단일 결과로 반환하고 일괄 처리가 적절하지 않기 때문에 두 번째 가져 오기에 fetchBatchSize가 필요하지 않습니다.

여기에 100 % 확실한 이유가 확실치 않지만 (코어 데이터 용어는 약간 이상합니다 ...) 결론은 모든 것이 의도 한대로 작동하고 있다고 생각합니다.

+0

+1이 대답은 의미가 있습니다.'setPropertiesToFetch :'메소드는 결과 타입이 NSDictionaryResultType이 아니라면 아무것도하지 않습니다 (이것은 답변에서 언급되어 있지만 명시 적으로 언급되지 않았습니다). 나는 코드가'setFetchBatchSize :'가 주석 처리 된 것처럼 보이기를 원한다. – yabada

+0

재미있는 메모 : NSFetchRequest 클래스 참조에서'setPropertiesToFetch :'에 대한 문서를 체크 아웃하면 누군가가 버그를 게시 한 것처럼 보이고 실수로 (?) 주석이 "토론"섹션에 들어간 것처럼 보입니다. 사람은 문서가 "resultType"이 NSDictionaryResultType으로 설정된 경우에만 값이 사용된다고 명시해야한다고 제안합니다. 그 이유는 "관리 대상 결과 유형에 적용되었다고 생각하기 때문에 한 시간을 잃었습니다." 이상한! – yabada

관련 문제