2012-09-06 6 views
11

に解決されました。コアデータフェッチプロパティ式では、明らかに$FETCH_SOURCEがオブジェクト自体ではなくオブジェクトIDに解決されています。これは、 "class is not key-value coding ..."という例外を引き起こしました。これは、そのキーに応答するオブジェクトなので真実です。

フェッチされたプロパティの述語の一部としてソースオブジェクトのプロパティ値を使用したいと思います。

これを修正する方法はありますか?

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<_NSObjectID_48_0 0x10101b200> valueForUndefinedKey:]: this class is not key value coding-compliant for the key messageType.' 
*** First throw call stack: 
(
    0 CoreFoundation      0x00007fff92ba00c6 __exceptionPreprocess + 198 
    1 libobjc.A.dylib      0x00007fff8f85e3f0 objc_exception_throw + 43 
    2 CoreFoundation      0x00007fff92c34249 -[NSException raise] + 9 
    3 Foundation       0x00007fff9518b08c -[NSObject(NSKeyValueCoding) valueForUndefinedKey:] + 238 
    4 Foundation       0x00007fff950d2df9 -[NSObject(NSKeyValueCoding) valueForKey:] + 400 
    5 Foundation       0x00007fff950f36a8 -[NSObject(NSKeyValueCoding) valueForKeyPath:] + 341 
    6 Foundation       0x00007fff950a3489 -[NSFunctionExpression expressionValueWithObject:context:] + 751 
    7 CoreData       0x00007fff88cbbdda -[NSSQLSimpleWhereIntermediate initWithPredicate:inScope:] + 618 
    8 CoreData       0x00007fff88cbb672 -[NSSQLGenerator generateWhereIntermediatesInContext:] + 162 
    9 CoreData       0x00007fff88cbb010 -[NSSQLGenerator generateIntermediatesForFetchInContext:countOnly:] + 416 
    10 CoreData       0x00007fff88cb7d30 -[NSSQLGenerator newSQLStatementForFetchRequest:ignoreInheritance:countOnly:nestingLevel:] + 400 
    11 CoreData       0x00007fff88cb7a97 -[NSSQLAdapter _newSelectStatementWithFetchRequest:ignoreInheritance:] + 471 
    12 CoreData       0x00007fff88cb76b6 -[NSSQLCore newRowsForFetchPlan:] + 118 
    13 CoreData       0x00007fff88cb6f2e -[NSSQLCore objectsForFetchRequest:inContext:] + 526 
    14 CoreData       0x00007fff88cb6a91 -[NSSQLCore executeRequest:withContext:error:] + 225 
    15 CoreData       0x00007fff88cb5f72 -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 2114 
    16 CoreData       0x00007fff88cb4309 -[NSManagedObjectContext executeFetchRequest:error:] + 537 
    17 CoreData       0x00007fff88cfca4e -[NSManagedObjectContext(_NestedContextSupport) _parentObjectsForFetchRequest:inContext:error:] + 414 
    18 CoreData       0x00007fff88d3072a __82-[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:]_block_invoke_0 + 634 
    19 libdispatch.dylib     0x00007fff8b2710b6 _dispatch_client_callout + 8 
    20 libdispatch.dylib     0x00007fff8b272723 _dispatch_barrier_sync_f_invoke + 39 
    21 CoreData       0x00007fff88cfc87c _perform + 172 
    22 CoreData       0x00007fff88cfc6c2 -[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:] + 354 
    23 CoreData       0x00007fff88cb4309 -[NSManagedObjectContext executeFetchRequest:error:] + 537 
    24 CoreData       0x00007fff88d0481e -[NSFaultHandler retainedFulfillAggregateFaultForObject:andRelationship:withContext:] + 254 
    25 CoreData       0x00007fff88d7faa8 -[_NSFaultingMutableArray willRead] + 120 
    26 CoreData       0x00007fff88d7fe99 -[_NSFaultingMutableArray count] + 25 
    27 CoreFoundation      0x00007fff92b82e69 -[NSArray lastObject] + 25 
    28 Scuttlebutt       0x0000000100041aab -[BSMessageCellView setObjectValue:] + 283 
    29 AppKit        0x00007fff936ca006 -[NSTableRowData _addViewToRowView:atColumn:row:] + 696 
    30 AppKit        0x00007fff936c9b5f -[NSTableRowData _addViewsToRowView:atRow:] + 151 
    31 AppKit        0x00007fff936c80f5 -[NSTableRowData _addRowViewForVisibleRow:withPriorView:] + 415 
    32 AppKit        0x00007fff936c7e7a -[NSTableRowData _addRowViewForVisibleRow:withPriorRowIndex:inDictionary:withRowAnimation:] + 272 
    33 AppKit        0x00007fff936c7149 -[NSTableRowData _unsafeUpdateVisibleRowEntries] + 740 
    34 AppKit        0x00007fff936c6ce1 -[NSTableRowData updateVisibleRowViews] + 119 
    35 AppKit        0x00007fff936da8b3 -[NSTableRowData _idleUpdateVisibleRows] + 66 
    36 CoreFoundation      0x00007fff92b5cdc4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20 
    37 CoreFoundation      0x00007fff92b5c8dd __CFRunLoopDoTimer + 557 
    38 CoreFoundation      0x00007fff92b420c9 __CFRunLoopRun + 1513 
    39 CoreFoundation      0x00007fff92b416e2 CFRunLoopRunSpecific + 290 
    40 HIToolbox       0x00007fff9427e0a4 RunCurrentEventLoopInMode + 209 
    41 HIToolbox       0x00007fff9427de42 ReceiveNextEventCommon + 356 
    42 HIToolbox       0x00007fff9427dcd3 BlockUntilNextEventMatchingListInMode + 62 
    43 AppKit        0x00007fff93544b13 _DPSNextEvent + 685 
    44 AppKit        0x00007fff935443d2 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 128 
    45 AppKit        0x00007fff9353b773 -[NSApplication run] + 517 
    46 AppKit        0x00007fff934e01a6 NSApplicationMain + 869 
    47 Scuttlebutt       0x0000000100002225 main + 53 
    48 Scuttlebutt       0x00000001000021e4 start + 52 
    49 ???         0x0000000000000003 0x0 + 3 
) 

これは私が問題のオブジェクトの詳細をダンプしようとしたときに思いついたものです - それは、オブジェクトIDの代わりに、オブジェクトそのものだということは非常に目に見えます。

(lldb) expression (NSString*) [(id)0x10101b200 description] 
(NSString *) $0 = 0x0000000108b03880 @"0x10101b200 <x-coredata://8F1FBB6B-505B-4169-A9D0-10D48CE5D4DC/YammerMessage/p101>" 
(lldb) expression (Class) [(id)0x10101b200 class] 
(Class) $2 = _NSObjectID_48_0 
+0

あなたの述語で$ FETCH_SOURCEのプロパティにアクセスできることを確かめてください。私は確信しています。 docs [https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW7]を確認してください。あなたはあなたの述語を投稿できますか? –

+0

私は同じ問題に直面しています。これは、RestKit APIを使用したコンテキストの作成に関連しているようです。私は定期的にcoredataスタックを使用する場合、すべてが正常に動作します。あなたは解決策を見つけましたか? – Donnit

答えて

1

あなたはNSManagedObjectResultTypeにそれを設定する必要があり、NSManagedObjectsを取得するために:,メソッドsetResultTypeでNSFe​​tchRequestの結果タイプを設定することができます。

NSFetchRequest *fetchrequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setResultType:NSManagedObjectResultType]; 

あなたはXCodeののCoreDataエディタを使用する場合は、フェッチ要求を選択し、右ユーティリティ]タブで[データモデルInspektor "タブに移動して、結果の種類を選択することができます。

編集: これはiOSの将来のバージョンで修正されています。このscreenshot

+0

Coredataエディタでフェッチされたプロパティを選択する私はuserinfoディクショナリのName、Destination、Predicate、およびKey-Valueの組のみを設定できます。どのように結果の種類を選択しますか?ありがとう。 – Donnit

+0

私の答えにスクリーンショットを追加しました – MeXx

0

は(私はバグを提出した。)を参照してください

+0

少し詳しく説明できますか?これは確認済みのiOSバグですか? –

+0

私はiOS 7.1で同じ問題を抱えています(Apple Developerフォーラムの他の人たち) - 私はバグ#16697979を提出しました。 – Rupert

+0

確認の修正ですか? Btw、OS Xアプリです。 – adib

3

あなたは絶対的に正しいです。 $ FETCH_SOURCEはNSManagedObjectIDに解決されるので、$ FETCH_SOURCE.myPropertyのようなものは例外をスローします(Appleのマニュアルではこの表記を使用しています)。

@implementation NSManagedObjectID (FetchFix) 

- (id)valueForUndefinedKey:(NSString *)key { 

    // Try to get the real object 
    NSManagedObject *object = [[NSManagedObjectContext defaultContext] objectWithID:self]; 
    return [object valueForKey:key]; 

} 

@end 

P.S.:

は、私が電話をキャッチし、実際のオブジェクトに転送し、私のプロジェクトに以下のカテゴリーを追加して、それを解決しました私はMagicalRecordを使用していますので、ショートカットはdefaultContextです。あなたのコードに適切なMOCを使用してください。

+0

これは、魔法のような単一の文脈がある場合にのみ機能します。複数のコアデータスタックを持つより複雑なアプリケーションや、アクティブな複数のコンテキストでは動作しません。管理対象オブジェクトIDのほかに、一般にコンテキストレスです。 – adib

+0

あなたはそうです。クイックフィックスであり、普遍的な解決策ではありません。 – frenya

+0

あなたは私たちの日を救った:)、ありがとう。 –

関連する問題