【问题标题】:Core Data NSPredicate checking for BOOL value核心数据 NSPredicate 检查 BOOL 值
【发布时间】:2011-04-09 20:38:20
【问题描述】:

我目前在从 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 手动过滤它。

我将非常感谢您的帮助。

非常感谢。

【问题讨论】:

    标签: iphone objective-c database core-data nspredicate


    【解决方案1】:

    基于Apple Document Here,我们可以使用以下两种方法来比较布尔值:

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

    但是,上面的谓词无法取出anAttribute 为空的谓词。根据苹果文档here,处理空属性需要如下方法:

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

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

    【讨论】:

      【解决方案2】:

      潜入 Swift 3/4 答案:

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

      显然,我们必须使用 NSNumber,因为 Apple 不接受文字布尔值。

      Stolen from here ;)

      【讨论】:

      • 天啊!你救了我的命...为什么它与false 一起工作而不是true... 我花了一段时间才找到导致我的应用程序崩溃的行,因为堆栈跟踪根本没有帮助。
      【解决方案3】:

      出于某种原因,Flow 的解决方案对我不起作用:

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

      但是,这样做:

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

      【讨论】:

      • 对于我的情况,Flow 的解决方案也不起作用。它与 anAttribute == 1 一起使用
      【解决方案4】:

      我迟到了,正如讨论的那样,使用 0 和 1 是可行的方法,但是有更好的方法可以通过使用 NSNumber BOOL 文字(如 @YES 或 @NO)来显示这一点。它将其转换为 1 或 0,但视觉上更友好。

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

      【讨论】:

        【解决方案5】:

        核心数据实体在您为 Entity 创建属性时没有任何默认值,因此要使您的谓词起作用,您应该为布尔属性设置默认值或以这种方式使用谓词。 p>

        如果您为实体的任何布尔属性提供默认值(否或是),则使用这样的谓词

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

        如果您没有有默认值,或者某些实体已经在没有默认值的情况下创建,那么要按 false 值过滤,请使用以下语句:

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

        【讨论】:

        • 空值检查很重要,尤其是当提取完成后,布尔条目可能看起来是假的,而实际上它们是空的
        【解决方案6】:

        斯威夫特:

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

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

        【讨论】:

          【解决方案7】:

          你没有提到你得到了什么结果。您的代码清单中缺少的两件事是您设置请求实体的位置以及您实际要求上下文执行获取请求的位置。我会从那里开始。

          【讨论】:

          • 您好,我没有将它包含在代码中。得到的结果基本上是全部。好像没有过滤工作。
          • 您好,我认为在那之前有什么问题。即每个返回的内容都有 object.bookmarked = YES,即使我默认将其设置为 NO。我需要检查一下。我认为,谓词是有效的。无论如何,谢谢。
          • 哈现在工作正常。愚蠢的我忘了先从模拟器重置数据库!反正上面的代码没问题。
          【解决方案8】:

          对我来说,保存时对象中的赋值是错误的。

          你必须这样保存

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

          那么所有谓词在获取时都会起作用。

          例如

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

          【讨论】:

            【解决方案9】:

            我一直被这个问题所困扰,核心数据中的布尔值是否保存为 NSNumbers 并不总是很清楚。

            在大多数情况下,我确保在创建实体时我为任何布尔属性设置了@NO,但总是有这样的情况,我花了一大堆时间试图弄清楚为什么我忘记了测试没有通过在实体创建时设置@NO。

            这可能不是清晰代码的最佳选择,但我现在开始总是使用 != 谓词作为核心数据中的布尔值,例如 (isCompleted != YES) 而不是 (isCompleted == NO)。事实上 nil == false 模式在其他任何地方都是正确的,但在核心数据谓词和属性中却不是这样,这可能会非常令人困惑。

            【讨论】:

              猜你喜欢
              • 2013-01-12
              • 2015-10-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-05-03
              • 2017-02-20
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多