5

私はこのメッセージでクラッシュしています:

'NSInvalidArgumentException'、理由:'キーパス名がエンティティに見つかりません

明らかに、私は自分のエンティティを正しくクエリしていません。

//fetching Data

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Viewer" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSString *attributeName = @"dF";

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@",attributeName];
[fetchRequest setPredicate:predicate];

NSLog(@"predicate : %@",predicate);
NSError *error;
NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
NSLog(@"items : %@",items);

[fetchRequest release];
    
//end of fetch

そして、これが私のデータモデルです:

代替テキスト

「dF」の値を返したいのですが、このように呼んではいけませんか?:

NSString *attributeName = @"dF";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@",attributeName];
4

2 に答える 2

7

プロパティから値をdF取得する場合は、の配列をフェッチしてから、NSManagedObjectsを使用[fetchedManagedObject valueForKey:@"dF"];して値を取得する必要があります。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Viewer" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];

NSManagedObject *mo = [items objectAtIndex:0];  // assuming that array is not empty
id value = [mo valueForKey:@"dF"];

述語はNSManagedObjects、基準を満たす配列を取得するために使用されます。たとえば、yourdFが数値の場合、「」のような述語を作成できdF > 100ます。フェッチリクエストは、NSManagedObjectsdF値が100を超える配列を返します。ただし、値だけを取得する場合は、述語は必要ありません。

于 2010-09-15T12:33:00.727 に答える
0

文字列で初期化されたNSSortDescriptorを使用していましたkey

let fetchRequest = NSFetchRequest<SomeManagedObject>(entityName: "SomeManagedObject")
let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]

name次に、モデルの属性の名前を変更しました。すべてのプロパティ名をリファクタリングしましたが、文字列型のをキャッチしませんでしたkey: "name"

Swiftの解決策は、NSSortDescriptor(keyPath:代わりに使用することです。これは、プロパティキーパスが変更された場合にコンパイルに失敗します。

NSSortDescriptor(keyPath: \SomeManagedObject.firstName, ascending: true)
于 2021-11-11T20:29:33.073 に答える