ios - NSPredicate 在 fethRequest 上返回不同的结果与过滤数组

标签 ios cocoa-touch sqlite core-data nspredicate

我有一个 Core Data SQLite 类型存储,我的实体中名为 Article 的属性之一是一个名为 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:将 markAsArchived 更改为 bool 属性而不是字符串属性不是一个选项。

更新:我已经查看了以下问题,但似乎没有一个对我有帮助。

NSPredicate Returns No Results with Fetch Request, Works with Array Filtering

Predicate works for array but not for 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.

最佳答案

假设您需要属性 markedAsArchived 为字符串(您会同意这是糟糕的设计),则获取请求的正确谓词是:

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

将常量替换为谓词格式字符串中的文字是不安全的。以上是检查此属性的标准方法。

关于ios - NSPredicate 在 fethRequest 上返回不同的结果与过滤数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15066162/

相关文章:

ios - UIWebView内部ScrollView

ios - Monotouch 在 GetCurrentProcess() 上崩溃

iphone - UIKit 用来确定要加载的正确 nib 名称的模式是什么?

ios - 如何每行显示 3 个单元格 UICollectionView

objective-c - 对 NSString 中的每个单词调用一个方法

c++ - boost::asio tcp 数据库服务器

ios - 在数据库连接类中使用共享实例的优势

ios - 文件夹 "Images.xcassets"不存在

c# - 为什么我的 Xamarin.Forms 应用程序在从 Web API 将数据插入 SQLite 数据库后崩溃?

python - 如何使用 MySQL 作为 django 项目的数据库?