【问题标题】:NSPredicate - filtering values based on a BOOLEAN stored valueNSPredicate - 基于 BOOLEAN 存储值过滤值
【发布时间】:2011-03-27 14:28:26
【问题描述】:

我有一个名为 Entry 的核心数据模型对象。 在这我有一个属性 IsFavorite。

我想使用 NSPredicate 来过滤我的 NSFetchedResultsController 的结果。

目前,当 fetch 执行时,我得到了 EXC_BAD_ACCESS。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate. 

NSEntityDescription *thisEntry = [NSEntityDescription entityForName:@"Entry" inManagedObjectContext:managedObjectContext_];
[fetchRequest setEntity:thisEntry];

NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"Entry.isFavorite == %@", [NSNumber numberWithBool: YES]];

[fetchRequest setPredicate:predicate];


NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;


NSError *error = nil;
if (![aFetchedResultsController performFetch:&error]) {
    NSlog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

如果我删除在 fetchRequest 上设置谓词的行,我的代码将完美执行。

我显然不了解谓词,但在尝试找出如何对核心数据模型对象中的 BOOLEAN 值执行操作时遇到了很多麻烦。请注意,有关于如何使用字符串或 int 值执行此操作的答案,但我找不到 BOOLEAN 示例。

非常感谢!

【问题讨论】:

    标签: iphone xcode nspredicate boolean


    【解决方案1】:

    检查 nil 或 false

    如果你之前没有设置值,即使是Bool数据类型也可能进入nil类别

     let predicate = NSPredicate(format: "isDeviceLine == nil OR isDeviceLine == %@", NSNumber(value: false))
    

    【讨论】:

      【解决方案2】:

      有趣的是,如果你“知道”你想要哪一个,你就可以拥有:

      let p = NSPredicate(format: "showMe == true")
      

      例子,

      let r = NSFetchRequest<NSFetchRequestResult>(entityName: "CDThing")
      let p = NSPredicate(format: "showMe == true")
      r.predicate = p
      

      您会为“订阅”、“新”等内容执行此操作。

      【讨论】:

        【解决方案3】:

        在 iOS 10、xcode 9.0 上,寻找具有布尔 NO 属性的核心数据 managedObject:

        [NSPredicate predicateWithFormat:@"attributeName == nil"]
        

        【讨论】:

          【解决方案4】:

          swift 3 版本非常适合我:

           let predicate = NSPredicate(format: "isFriend == %@" ,NSNumber(booleanLiteral: false))
          

          在@scipilot 回答之后,布尔值不应该是可选的。谢谢!

          【讨论】:

            【解决方案5】:

            对我来说,在 SWIFT 3.0 上使用 NSNumber 而 %@ 不起作用,我不得不使用整数值:

            NSPredicate(format: "yourAttributeName == %i", yourBooleanValue ? 1 : 0)
            

            【讨论】:

              【解决方案6】:

              这并不是真正特定于 NSPredicate... 每当您在格式字符串中有 %@ 时,相应的值必须是指向对象的指针,而 BOOL 不符合条件。因此,不要传递 YES,而是传递 [NSNumber numberWithBool: YES]


              在比我最初写答案时更新的 Xcode 和 SDK 版本中,您可以使用 @YES 而不是 [NSNumber numberWithBool: YES]

              【讨论】:

              • 我已经更新了我上面的代码 - 它仍然与 EXC_BAD_ACCESS 一起崩溃 :( 会是 Entity.Attribute =? 就像我写的那样?还是只是 Attribute =?
              • 如果我使用这样的 NSNumber 描述 [[NSNumber numberWithBool: NO] description];,这对我有用
              • @T. Markle description 方法在stringWithFormat 向对象询问其字符串表示时被调用。您应该能够在没有 description 调用的情况下使用 NSNumber 实例。
              【解决方案7】:

              来自 Apple 的文档:

              布尔值

              您指定并测试布尔值的相等性,如以下示例所示:

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

              但是,有件事让我很吃惊:

              一定要取消勾选Optional实体属性并设置Default ValueYESNO,否则该列将为空(null?)并且上述谓词将不匹配未明确显示的行设置。

              我使用出色的应用程序 sqllitebrowser 通过查看生成的模拟器数据库来诊断这个。

              【讨论】:

              • 对不起@János 我还不太了解 Swift。
              • 非常感谢您指出“请务必取消勾选可选实体属性”。节省了我的时间!
              • 很高兴为您提供帮助!我花了几个小时在上面……现在我更加关注右侧的面板,直到那时我都忽略了它。
              • 非可选布尔值解决了我遇到的一个大问题。在我看来,检查 boolAttribute != YES 应该可以工作,但是直到我在字段上设置默认值才可以
              • 感谢关于可选和默认值的提示,您节省了我的一天!
              【解决方案8】:

              对我来说是这样的

              NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(isComplete LIKE[c] %@)",[NSString stringWithFormat:@"%@",[NSNumber numberWithBool:YES]]];
              

              【讨论】:

                【解决方案9】:

                如果您知道自己正在寻找“是”(因此不需要在不同情况下在“是”或“否”之间切换),这对我有用:

                [NSPredicate predicateWithFormat:@"isFavorite == 1"]
                

                【讨论】:

                • 应该是动态值。
                • @KETAN 如果你知道你正在寻找 YES,那么 @"isFavorite == YES" 就可以了。
                • 我认为你应该使用 "%@", @YES
                猜你喜欢
                • 1970-01-01
                • 2012-06-14
                • 2012-06-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-01-29
                相关资源
                最近更新 更多