web-dev-qa-db-ja.com

Core Data NSPredicateによるBOOL値のチェック

現在、dbからすべてのデータをプルする際に問題が発生しています。つまり、1つのパラメーターがTRUEです。

私はNSPredicateを使用しており、以下はサンプルコードです

_NSManagedObjectContext *context = managedObjectContext_;

if (!context) {
    // Handle the error.
    NSLog(@"ERROR CONTEXT IS NIL");
}

NSEntityDescription *entity = [NSEntityDescription entityForName:@"tblcontent" inManagedObjectContext:managedObjectContext_];

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

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"bookmarked == YES"];

[request setPredicate:predicate];
_

Predicatewithformatをほとんどすべてに設定しようとしましたが、YES値を持つブックマークがまだ引き出されません。

私も_(@"bookmarked == %d",YES)_を試しましたが、運がよかったです。配列全体を取得し、if(object.bookmarked == YES) ..... blablaを実行して手動でフィルタリングする必要はありません。

本当に助かります。

どうもありがとう。

34
user281300

Apple Document Here )に基づいて、次の2つの方法を使用してブール値を比較できます。

NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"anAttribute == %@",[NSNumber numberWithBool:aBool]];
NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];

ただし、上記の述語は、anAttributeが空の述語を取得できません。空の属性を処理するには、Apple document here )に従って次のメソッドが必要です。

predicate = [NSPredicate predicateWithFormat:@"firstName = nil"]; // it's in the document

または

predicate = [NSPredicate predicateWithFormat:@"firstName == nil"]; // == and = are interchangeable here
62
Mingming

なんらかの理由で、フローのソリューションは私にはうまくいきません:

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];

ただし、これは次のとおりです。

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == 1"];
12
Dan Loughney

私はパーティーに遅れました、そして0と1を使用して議論したように行く方法ですが、@ YESや@NOのようなNSNumber BOOLリテラルを使用してこれを示すより良い方法があります。それを1または0に変換しますが、視覚的にわかりやすくなっています。

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == %@", @NO];
10
Patrick

Swift 3/4の答えで忍び寄る:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))

Appleでは文字通りのブール値は受け入れられないため、明らかにNSNumberを使用する必要があります。

ここから盗まれます;)

8
davidrynn

コアデータエンティティデフォルト値はありませんエンティティの属性を作成する場合、述語を機能させるには、ブール属性のデフォルト値を設定するか、この方法で述語を使用する必要があります。

Entityのブールプロパティに対してデフォルト値を提供(NOまたはYES)の場合、このような述語を使用します。

[NSPredicate predicateWithFormat:@"boolAttribute == %@", @NO];
[NSPredicate predicateWithFormat:@"boolAttribute == NO", @NO];
[NSPredicate predicateWithFormat:@"boolAttribute == %0"];

しないにデフォルト値があるか、一部のエンティティがデフォルト値なしですでに作成されている場合、false値でフィルタリングするには、次の文を使用します。

[NSPredicate predicateWithFormat:@"boolAttribute == %@ || boolAttribute == nil", @NO];
3

どのような結果が得られるかについては言及していません。コードリストにない2つのことは、リクエストのエンティティを設定する場所と、フェッチリクエストの実行を実際にコンテキストに要求する場所です。そこから始めます。

1
Joshua Nozzi

私にとって、保存時にObjectの値の割り当てが間違っていることが起こりました。

このように保存する必要があります

YourNSMNanagedObject.visibleBoolean = [[NSNumber alloc] initWithBool:false]

その後、フェッチ時にすべての述語が機能します。

例えば。

// Filter only unvisible item
NSPredicate *favouriteFilter = [NSPredicate predicateWithFormat:@"visibleBoolean==NO"];
1
Thein

私はこれに少しずつ気をつけており、コアデータのブール値がNSNumbersとして保存されることは必ずしも明確ではありません。

ほとんどの場合、エンティティを作成するときはブールプロパティに@NOを設定しますが、@を設定するのを忘れたときにテストが不合格になる理由を理解するために、かなりの時間を費やす場合が常にあります。エンティティの作成ではNO。

これは明確なコードに最適な選択ではないかもしれませんが、コアデータのブール値には常に(isCompleted!= YES)ではなく(isCompleted!= YES)のように!=述語を常に使用するようになりました。事実nil == falseパターンは他のすべての場所でtrueですが、コアデータの述語とプロパティではそうではなく、非常に混乱する可能性があります。

0
SpaceTrucker

迅速:

fetchRequest.predicate = NSPredicate(format: "%K == NO",#keyPath(MyEntity.isOccupied))

または

fetchRequest.predicate = NSPredicate(format: "%K == NO",\MyEntity.isOccupied)
0
Hemang