0

CoreDataで奇妙な問題が発生しています。問題は、プロパティがX未満のオブジェクトを探しているのに、一致するすべての値が返されないことです。キャッシュがなく、// [fetchRequest setFetchBatchSize:50]を使用していません。

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.level <= [cd] %@", [self.filters objectForKey:@"level"]];

それを述語のMutableArrayに追加し、後でNSPredicate * myPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates];を実行します。

これは、preparePredicatesと呼ばれるmyPredicateを返す関数内にあります。今のところ、これ以上の述語はなく、1つだけです。NSLogが返すのは:level <=[cd]"30"です。文字列のintValueと%iでも試してみました。主な関数は次のとおりです。

NSError* error;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"myEntity"
                                          inManagedObjectContext:self.context];
[fetchRequest setEntity:entity];
NSPredicate* predicate = [self preparePredicates]; 
[fetchRequest setPredicate:predicate];

//[fetchRequest setFetchBatchSize:50];
NSArray *fetchedObjects = [self.context executeFetchRequest:fetchRequest error:&error];
NSLog (@"Error: %@", error);
NSLog(@"los fetchedobjects: %i",[fetchedObjects count]);
return fetchedObjects;

エラーは返されません。結果を見ると、レベル6のものはありませんが、一致するものは他にもあります(すべて指定された値よりも小さい)。レベル6のものがあることは知っています。SQLiteデータベースブラウザで.sqliteを開くと、そこに表示されます。私がこのプログラムでやるなら

SELECT * FROM zmyentity WHERE zlevel <30; 

CoreDataと同じように表示されません。しかし、SELECT * FROM zmyentity WHERE zlevel==6を実行すると; 現れる。何が起こっているのか本当にわかりません。ルーキーのミスをしているのかもしれませんので、正しい方向に向けてください。事前にどうもありがとうございました。

4

1 に答える 1

0

おそらく、レベルを文字列属性として保存しているのは、

"30" < "6"

文字列を比較するとき。数値属性タイプ(整数16/32/64)を選択すると、問題が解決するはずです。その場合、クラス内の対応するlevelプロパティはタイプを持ちます。myEntityNSNumber

[cd]また、述語の修飾子は省略してください。これにより、文字列の比較が強制されます。

述語は次のようになります。

[NSPredicate predicateWithFormat:@"self.level <= %d", [[self.filters objectForKey:@"level"] intValue]]
于 2013-01-11T06:17:38.663 に答える