0

私は、fetchedResultsControllerを使用してCore Dataを使用してUITableViewをセットアップしようとしています。fetchedResultsController NSArrayの代わりにNSCFStringを返すfetchedObjects

クエリ自体はokと表示されます。私はそれをexecuteFetchRequestステートメントでテストします。

performFetchをエラーなしで呼び出します。

私はfetchedObjectsにアクセスしようとすると、私はEXC_BAD_ACCESSを取得します。

Xcodeで返される変数を見ると、NSArrayではなく_NSCFStringが返されているようです。

私はGoogle上でできることをすべて探し、このコードの多くの例を見つけましたが、私が間違っていることを理解できません。私は同じ問題の例を見つけることができないようです。

@interface MainViewController : UIViewController <NSFetchedResultsControllerDelegate> { 

NSFetchedResultsController *_fetchedResultsController; 
} 

@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController; 

.mファイル

@synthesize fetchedResultsController = _fetchedResultsController; 

- (NSFetchedResultsController *)fetchedResultsController { 

if (_fetchedResultsController != nil) { 
    return _fetchedResultsController; 
} 

/* 
Set up the fetched results controller. 
*/ 
// Create the fetch request for the entity. 

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Ingredient"]; 
request.predicate = [NSPredicate predicateWithFormat:@"recipe.name = %@",[self theRecipe].name]; 
NSSortDescriptor *aSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"sequenceNumber" ascending:YES]; 
request.sortDescriptors = [NSArray arrayWithObject:aSortDescriptor]; 

NSError *error = nil; 
NSArray *ingredients = [[self managedObjectContext] executeFetchRequest:request error:&error]; 

if (!ingredients) { 
    NSLog(@"** No Ingredients found"); 
} else if ([ingredients count] >= 0) { 
    NSLog(@"**%d Ingredients found", [ingredients count]); 
} 

// 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:request managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil cacheName:@"myCache"]; 
aFetchedResultsController.delegate = self; 
[self setFetchedResultsController:aFetchedResultsController]; 

return _fetchedResultsController; 
}  

内部のviewDidLoadフェッチ内部の私のexecuteFetchRequestから

NSError *error = nil; 
if (![[self fetchedResultsController] performFetch:&error]) { 

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

NSLog(@"fetchRequest = .... %@",[[self fetchedResultsController] fetchRequest]); 
NSLog(@"fetchedObjects = .... %@",[[self fetchedResultsController] fetchedObjects]); 
NSLog(@"lastObject = .... %@",[[[self fetchedResultsController] fetchedObjects] lastObject]); 
Ingredient *test = [[[self fetchedResultsController] fetchedObjects] lastObject]; 
NSLog(@"test = %@", test.ingredient); 
NSArray *fetchedObjects = [[self fetchedResultsController] fetchedObjects]; // EXC_BAD_ACCESS hit here 
NSLog(@".... ingredients count = %@", [fetchedObjects count]); 

結果

.hファイル:

は、以下のコードセクションです

2012-03-24 08:46:23.186 My App[103:707] fetchRequest = .... <NSFetchRequest: 0x2c5180> (entity: Ingredient; predicate: (recipe.name == "Lasagne"); sortDescriptors: ((
"(sequenceNumber, ascending, compare:)" 
)); type: NSManagedObjectResultType;) 

2012-03-24 08:46:23.192 My App[103:707] fetchedObjects = .... (
"<Ingredient: 0xee23e80> (entity: Ingredient; id: 0xee23100 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p9> ; data: <fault>)", 
"<Ingredient: 0xee24120> (entity: Ingredient; id: 0xee23160 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p3> ; data: <fault>)", 
"<Ingredient: 0xeed59a0> (entity: Ingredient; id: 0xee23170 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p7> ; data: <fault>)", 
"<Ingredient: 0xeed5a00> (entity: Ingredient; id: 0xee23180 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p2> ; data: <fault>)", 
"<Ingredient: 0xee243c0> (entity: Ingredient; id: 0xee23190 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p5> ; data: <fault>)", 
"<Ingredient: 0xee24410> (entity: Ingredient; id: 0xee231a0 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p1> ; data: <fault>)", 
"<Ingredient: 0xee24460> (entity: Ingredient; id: 0xee231b0 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p6> ; data: <fault>)", 
"<Ingredient: 0xee244c0> (entity: Ingredient; id: 0xee231c0 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p8> ; data: <fault>)" 

これは8つの結果レコードを示していますResultsController方法ここでは

2012-03-24 08:46:23.171 My App[103:707] **8 Ingredients found 

は、私が手にログ出力されます。これは私が期待していることです。

2012-03-24 08:46:23.195 My App[103:707] lastObject = .... <Ingredient: 0xee244c0> (entity: Ingredient; id: 0xee231c0 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p8> ; data: <fault>) 

2012-03-24 08:46:23.198 My App[103:707] test = Salt 

これもまた私が期待している値です。

(gdb) 

なぜfetchedObjectsの結果はNSArrayではないのですか?どのようにすればいいですか?

ありがとうございました。

答えて

1

私はあなたのコードは、このラインにクラッシュしたと思う:オブジェクトへ

NSLog(@".... ingredients count = %@", [fetchedObjects count]); 

%@ポイント。それは%iである必要があります。 [fetchedObjects count]は、オブジェクトではないNSUIntegerを返します。だから、行は次のようになります。このページでは

NSLog(@".... ingredients count = %i", [fetchedObjects count]); 

ルック:String Format Specifiers

+0

どうもありがとうございましたが。それはそれだった。 – Scoop

関連する問題