Core Data Fetch 没有返回它应该返回的对象

Posted

技术标签:

【中文标题】Core Data Fetch 没有返回它应该返回的对象【英文标题】:Core Data Fetch doesn't return the object it should 【发布时间】:2014-02-21 12:08:07 【问题描述】:

在 Core Data 中,我有一个 Property 实体,其属性 currentPage 类型为 Integer 16。它与具有标量属性的类ATProperty 相关联:

@interface ATProperty : NSManagedObject

@property(nonatomic, assign) int16_t currentPage;

@end


@implementation ATProperty

@dynamic currentPage;

@end

现在我有以下代码来执行请求:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Property"];
request.predicate = [NSPredicate predicateWithFormat:@"currentPage != 0"];
NSArray *results = [context executeFetchRequest:request error:nil];

大多数时候,它按预期工作。但有时,我会得到以下奇怪的结果:

(lldb)po results
<__NSArrayI 0x17e61300>(

)

(lldb)po [context executeFetchRequest:[NSFetchRequest fetchRequestWithEntityName:@"Property"] error:nil]
<_PFArray 0x17e9f3e0>(
<ATProperty: 0x17ec6400> (entity: Property; id: 0x19178e20 <x-coredata:///Property/t88822504-5974-42F5-B8D2-A62325064AFF28> ; data: 
    currentPage = 9;
)
)

(lldb)p (BOOL)[request.predicate evaluateWithObject:0x17ec6400]
(BOOL) $12 = YES

因此在托管对象上下文中存在一个实体实例。当我执行我的 fetch 请求时,Core Data 不返回这个对象,它返回一个空数组。但是,如果我在上下文中存在的对象上测试相同的谓词,则谓词的计算结果为YES。这意味着该对象应该在结果中。这怎么可能?

【问题讨论】:

错误信息你传nil,说明你对它不感兴趣。你看过那个吗? 我没有,因为它返回了一个(空)数组,所以应该没有错误。如果有错误,它应该返回 nil 而不是数组。 什么是performFetchRequest:error:?这不是标准的核心数据方法。 对不起,我的意思是executeFetchRequest:error:。我从头开始编写,而不是从实际代码中复制/粘贴,并且没有 IDE 来查明错误(而且我仍然总是开始输入 perform... 之前更正为 execute.. . 当我看到自动完成功能没有启动时)。 【参考方案1】:

你能试试下面的代码模拟吗?这对我来说真的很有效,也有助于我们避免崩溃和其他结果问题。

NSManagedObjectContext *managedObjectContext;
    NSEntityDescription *entityDesc = [NSEntityDescription
                                       entityForName:@"Property"
                                       inManagedObjectContext:managedObjectContext];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDesc];

    NSPredicate *pred =
    [NSPredicate predicateWithFormat:@"currentPage != 0"];

    [request setPredicate:pred];
    NSManagedObject *matches = nil;

    NSError *error;
    NSArray *objects = [context executeFetchRequest:request
                                              error:&error];

    if ([objects count] > 0) 
        NSLog();
    

希望对您有所帮助。如果我们必须采用其他解决方案,请告诉我。

【讨论】:

这在功能上与原始代码相同。当它甚至没有不同时,这应该如何提供帮助?使用没有字符串打印的NSLog() 有什么意义?

以上是关于Core Data Fetch 没有返回它应该返回的对象的主要内容,如果未能解决你的问题,请参考以下文章

Core Data fetch 中的谓词返回的结果与数组上的相同谓词不同

iOS Core Data Fetch Request,如何使用

Core data multithreading fetch record

Core Data 实体在方法中返回后缺少其属性

Spring Data 'Left Join Fetch' 查询返回 null

导入时获取返回未定义