2012-06-15 124 views
3

任何人都可以知道为什么这不返回任何ManagedObjects?我试图添加到ATNSManagedObject + EasyFetching类如下,但取回结果什么也没有返回。如果我在EasyFetch类的外部获取这些对象,我有100多个对象,所以我知道它不是CoreData是空的。NSFetchRequest什么都不返回

+ (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]; 
} 
+0

'NSEntityDescription * entity = [self entityDescriptionInContext:context]''? –

+0

你确定结果数组是非零(而不是空数组)吗? Apple文档声明您应该检查非零结果(而不是检查非零错误)以检测错误情况。我认识到这可能不会导致这里的解决方案,但可以帮助您避免将来的混淆(显然即使没有错误条件,错误也可能不为零。返回nil而不是NSArray是准确检测错误) –

+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对象。

UPDATE:

只想添加此passage

返回值

“符合从接收器中取出,并从相关联的持久性存储由请求指定的条件的对象的数组接收方的持久存储协调器,如果发生错误,则返回nil;如果没有对象符合请求指定的标准,则返回一个空数组“。

1

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

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

+0

对于通过代码运行的任何人样本,我犯了错误,调用_managedObjectContext而不是self.managedObjectContext。后者是在默认的AppDelegate.m中加载的 – seo

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来揭示问题。