3

谁能发现为什么这没有返回任何 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];
}
4

3 回答 3

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

更新:

只是想添加这段

返回值

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

于 2012-06-15T15:59:39.900 回答
1

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

我没有找到 的文档[NSManagedObjectContext defaultContext],所以我假设这是您编写(或正在使用)的类别;而且我怀疑它并不总是返回有效的上下文。添加一些日志并查看!

于 2012-06-15T16:12:09.370 回答
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 来揭示问题。

于 2012-06-15T17:10:16.097 回答