核心数据返回NSArrays而不是NSStrings

时间:2011-07-07 20:36:41

标签: ios core-data nsarray

由于某种原因,所有NSString类型的属性都在我的Article对象中作为NSArrays返回。这是我检索它们的功能:

- (NSArray *)getSavedArticles
{
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
    NSError *error = nil;
    NSEntityDescription *entity = [NSEntityDescription 
                                   entityForName:@"Article" inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entity];
    NSSortDescriptor *dateSort = [NSSortDescriptor sortDescriptorWithKey:@"last_opened" ascending:NO];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:dateSort]];
    NSArray *fetchedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
    return fetchedObjects;
}
我还没有为这些创建NSManagedObjectModel,而只是使用KVO访问它们。

//self.data has the array returned from getSavedArticles
NSManagedObject *object = [self.data objectAtIndex:indexPath.row]; 
NSString *path  = [object valueForKey:@"path"];
NSString* id      = [object valueForKey:@"id"];

当我在变量窗格中查看此内容时,在pathid上,我看到(__NSArrayI *) ... Variable is not a CFString.打印其中任何一个的描述也会打印出打印数组时使用的括号。< / p>

我只是想知道这是否可能是由于排序描述符造成的?我已经仔细检查过正确输入这些对象的数据,而我用来备份所有内容的SQLite数据库正在显示字符串。

我尝试在模拟器中重新安装应用程序并重置它。我仍然得到一个NSArray而不是NSString。

我真的不知道这里发生了什么。任何帮助将不胜感激。

编辑:我刚发现其他有趣的东西。我再做一次检查,看看文章是否已保存,这次我没有获得文章路径的NSArray:

- (NSString *)hasArticleSaved:(NSString *)id
{
    NSString *path = nil;
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"%K == %@", @"id", id]];
    NSEntityDescription *entity = [NSEntityDescription 
                                   entityForName:@"Article" inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entity];
    NSError *error = nil;
    NSArray *fetchedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
    if (fetchedObjects.count > 0) {
       NSManagedObject *savedArticle = [fetchedObjects objectAtIndex:0];
        path = [savedArticle valueForKey:@"path"];
    }
    return path;
}

现在我真的很困惑。任何人?

2 个答案:

答案 0 :(得分:0)

你的问题在这里:

[self.data objectForKey:indexPath.row]

...因为objectForKey:正在寻找字符串键名,例如“path”或“id”。给它一个整数将产生错误或随机返回。

相反,你想要:

[self.data objectAtIndex:indexPath.row]

...将返回数组中给定索引处的托管对象。

答案 1 :(得分:0)

我发现了这个问题。我已经更改了我的表的数据结构,所以self.data是一个数组数组...只有一个对象,看起来我得到了一个N​​SArray,实际上我只是访问错误的数据。我只需要做[[self.data objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];