-1

SQL ステートメント SELECT * FROM TABLE WHERE ACTION IN ('A','B');

次のコードは例外をスローしています

- (NSArray*) fetchManagedObjects:(NSString*)className withFlag:(NSString*)flag{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:className inManagedObjectContext:[self managedObjectContext]];
    fetchRequest.entity = entity;
    NSMutableString *str = [NSMutableString stringWithFormat:@" ( 1== 1 ) "];
    if ([className isEqualToString:@"Entity3"]) {
        [str appendFormat:@" AND ( kfollowAction IN ('%@')  ) ", flag];
    }
    NSPredicate *predicate = [NSPredicate predicateWithFormat:str];
    fetchRequest.predicate = predicate;
    NSError *error = nil;
    NSArray *entities = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    return entities;
}

2013-06-20 16:45:51.318 CNPL[1447:1a903] *キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。 throw call stack: (0x3647012 0x2ea2e7e 0x36d24bd 0x3636bbc 0x363694e 0x192966c 0x1928e06 0x191b829 0x191ad08 0x1915915 0x19155f2 0x19153c0 0x1915195 0x1914977 0x1914464 0x19135dd 0x1911539 0xdce02 0xe261a 0x1ec81c7 0x1ec8232 0x1ec84da 0x1edf8e5 0x1edf9cb 0x1edfc76 0x1edfd71 0x1ee089b 0x1ee0e93 0x1ee0a88 0xe1dd3 0x2eb6705 0x1dea2c0 0x1dea258 0x1eab021 0x1eab57f 0x1eaa6e8 0x1e19cef 0x1e19f02 0x1df7d4a 0x1de9698 0x3909df9 0x3909ad0 0x35bcbf5 0x35bc962 0x35edbb6 0x35ecf44 0x35ece1b 0x39087e3 0x3908668 0x1de6ffc 0x1ab1a 0x2f35)

Coredata の使用方法

4

1 に答える 1

2

まず第一に、述語を構築するために使用しないでください。stringWithFormatとでは、書式指定子と引用符の動作が異なるため、述語に文字列書式設定関数を使用するstringWithFormatと、エラーが発生しやすくなります実行時に述語を組み合わせる必要がある場合は、 のメソッドを使用します。predicateWithFormatNSCompoundPredicate

「kfollowAction」属性が特定のリストのいずれかの値を持つオブジェクトを選択するには、配列で「IN」演算子を使用する必要があります。次に例を示します。

NSArray *flags = @[@"A", @"B"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"kfollowAction IN %@", flags]; 

ダミーの述語「( 1== 1 )」も必要ありません。すべてのオブジェクトをフェッチする場合は、フェッチ リクエストに述語を設定しないでください。

于 2013-06-20T09:24:20.953 に答える