NSFetchRequest什么也没有返回

时间:2012-06-15 15:41:08

标签: objective-c core-data nsfetchrequest

有谁能发现为什么这不会返回任何ManagedObjects?我正在尝试添加以下ATNSManagedObject + EasyFetching类,但获取结果不返回任何内容。如果我在EasyFetch类之外获取这些,我有100多个对象,所以我知道CoreData不是空的。

+ (void)deleteAllObjectsInContext;
{
    NSManagedObjectContext *context = [NSManagedObjectContext defaultContext];
    NSEntityDescription *entity = [self entityDescriptionInContext:context];
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    [request setEntity:entity];
    //[request setIncludesPropertyValues:NO];

    NSError *error = nil;
    NSArray *results = [context executeFetchRequest:request error:&error];
    if (error != nil)
    {
        //handle errors
        NSLog(@"delete error");
    }

    for (NSManagedObject *thing in results) {  <--- |results shows 0 objects|
        [context deleteObject:thing];
    }

    NSError *saveError = nil;
    [context save:&saveError];
}

3 个答案:

答案 0 :(得分:2)

尝试将其简化为:

// first get the context or pass it in as an argument (this is usually what I do for
// a deleteAll class level method like this but your call

+ (void)deleteAllObjectsInContext:(NSManagedObjectContext*)context {

    NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@ "<yourEntity>"];
    // no predicate
    // no sortDescriptors

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

    if (!results || error) { // nil is an error
        // handle error
    }

    // do something with results

}
通过这种方式,您可以避免必须检索NSEntityDescription对象。

更新:

只想添加此passage

返回值

“满足从接收者和从接收者的持久存储协调器关联的持久存储中获取的请求所指定条件的对象数组。如果发生错误,则返回nil。如果没有对象符合请求指定的条件,返回一个空数组“。

答案 1 :(得分:1)

一种可能性是您的NSManagedObjectContext *context实际上是nil。 在Objective-C中,将消息发送到nil是完全可以接受的,并且很难检测到问题所在。

我没有找到[NSManagedObjectContext defaultContext]的文档,因此我认为这是您编写(或正在使用)的类别;我怀疑它不是总是返回一个有效的上下文。添加一些日志记录并查看!

答案 2 :(得分:0)

尝试此方法并观看日志。它只是从当前实体获取所有内容。

+ (NSArray*) retrieveEntity:(NSString*) entityName {

// !!!Here you put your context
NSManagedObjectContext *context = appDelegate.managedObjectContext;

if (context == nil) {
    NSLog(@"Error: No context");
    return nil;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

if (fetchedObjects == nil) {
    // Handle the error
    NSLog(@"Error: No fetched objects.");
    return nil;
}
else 
    NSLog(@"Retrieved objects count:%d", [fetchedObjects count]);

return fetchedObjects;
}

这是一个例子,如何调用它。

    // Retrieve all products
NSArray *flXProducts = [DbConnection retrieveEntity:@"FLXProduct"];

如果返回0,则表示数据库存在问题。您可以通过查找数据库的sql文件并在终端中对其进行简单的SQL来揭示问题。