2

Core Data SQLite タイプ ストアがあります。Article というエンティティの属性の 1 つは、markAsArchived という文字列属性です。

私がやりたいのは、markAsArchived が YES ではない (bool ではなく文字列値) 最初の 100 個のアイテムを取得するためのフェッチ要求をセットアップすることです。

というわけで、これが 0 の結果を返すフェッチ リクエストをセットアップするために使用するコードです。

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Article"];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"markAsArchived != 'YES'"]];
[fetchRequest setFetchLimit:100];
NSError *error = nil;
self.articles = [NSMutableArray arrayWithArray:[self.managedObjectContext executeFetchRequest:fetchRequest error:&error]];

if (error) {
    //Handle the error
    NSLog(@"%@", error);
}

ただし、まったく同じ述語をフェッチ要求から削除し、代わりにそれを使用してフェッチ要求によって返された配列をフィルター処理すると、必要な結果が得られます。これを行うために使用するコードは次のとおりです。

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Article"];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]];
[fetchRequest setFetchLimit:100];
NSError *error = nil;
self.articles = [NSMutableArray arrayWithArray:[self.managedObjectContext executeFetchRequest:fetchRequest error:&error]];

if (error) {
    //Handle the error
    NSLog(@"%@", error);
}
self.articles = [NSMutableArray arrayWithArray:[self.articles filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"markAsArchived != 'YES'"]]];

さて、私の問題は、100個のフェッチされたアイテムの配列をフィルタリングしているため、結果として得られるフィルタリングされた配列は通常、私が望むものではない100未満になることです。

私の推測では、述語を使用してフェッチ要求を設定するときに、信じられないほどお粗末なことをしていると思います。私が間違っているかもしれないことについての指針はありますか?

PS:文字列属性ではなく bool 属性に markAsArchived を変更することはできません。

更新:次の質問に目を通しましたが、どれも役に立たなかったようです。

NSPredicate はフェッチ要求で結果を返さず、配列フィルタリングで動作します

述語は配列では機能しますが、fetchRequest では機能しません

更新 (2013 年 3 月 1 日):*私の知る限り、executeFetchRequest は nil ではなく空の配列を返します。念のため再確認しました。

起動引数で取得したデバッグ出力は次のとおりです...

2013-03-01 20:29:48.218 PROJECTNAME[753:907] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCONTENT, t0.ZDATE, t0.ZENCLOSURELENGHT, t0.ZENCLOSURETYPE, t0.ZENCLOSUREURL, t0.ZFULLTEXT, t0.ZIDENTIFIER, t0.ZIMAGE, t0.ZLINK, t0.ZMARKASARCHIVED, t0.ZREAD, t0.ZREADPOSITION, t0.ZSUMMARY, t0.ZTITLE, t0.ZUPDATED, t0.ZFEED FROM ZARTICLE t0 WHERE  t0.ZMARKASARCHIVED <> ? ORDER BY t0.ZDATE DESC LIMIT 119
2013-03-01 20:29:48.221 PROJECTNAME[753:907] CoreData: details: SQLite bind[0] = "YES"
2013-03-01 20:29:48.287 PROJECTNAME[753:907] CoreData: annotation: sql connection fetch time: 0.0689s
2013-03-01 20:29:48.289 PROJECTNAME[753:907] CoreData: annotation: fetch using NSSQLiteStatement <0x1f218d70> on entity 'Article' with sql text 'SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCONTENT, t0.ZDATE, t0.ZENCLOSURELENGHT, t0.ZENCLOSURETYPE, t0.ZENCLOSUREURL, t0.ZFULLTEXT, t0.ZIDENTIFIER, t0.ZIMAGE, t0.ZLINK, t0.ZMARKASARCHIVED, t0.ZREAD, t0.ZREADPOSITION, t0.ZSUMMARY, t0.ZTITLE, t0.ZUPDATED, t0.ZFEED FROM ZARTICLE t0 WHERE  t0.ZMARKASARCHIVED <> ? ORDER BY t0.ZDATE DESC LIMIT 119' returned 0 rows with values: ( )
2013-03-01 20:29:48.291 PROJECTNAME[753:907] CoreData: annotation: total fetch execution time: 0.0734s for 0 rows.
4

2 に答える 2

0

属性を文字列にする必要があると仮定するとmarkedAsArchived(これは悪い設計であることに同意するでしょう)、フェッチ要求の正しい述語は次のとおりです。

[NSPredicate predicateWithFormat:@"markedAsArchived != %@", @"YES"]

述語フォーマット文字列で定数をリテラルとして置き換えるのは安全ではありません。上記は、この属性をチェックする標準的な方法です。

于 2013-02-25T15:21:04.380 に答える