Core Data Fetch不会返回它应该返回的对象

时间:2014-02-21 12:08:07

标签: ios core-data nspredicate nsfetchrequest

在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

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

1 个答案:

答案 0 :(得分:0)

您可以在下面尝试使用代码模拟吗?它对我来说真的很有用,也可以帮助我们限制崩溃和其他结果问题。

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();
    }

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