Базовые данные, возвращающие NSArrays вместо NSStrings - PullRequest
5 голосов
/ 08 июля 2011

По какой-то причине все типизированные атрибуты NSString возвращаются как NSArrays в моем объекте Article. Вот моя функция для их извлечения:

- (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"];

Когда я смотрю на это в области переменных, на path и id вижу (__NSArrayI *) ... Variable is not a CFString. Печать описания любого из них также выводит скобки, используемые при печати массивов.

Мне просто интересно, может ли это быть из-за дескриптора сортировки? Я дважды проверил, правильно ли введены данные, поступающие в эти объекты, и база данных 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 голосов
/ 08 июля 2011

Я нашел проблему. Я изменил структуру данных для своей таблицы, так что self.data - это массив массивов ... и только с одним объектом выглядело, как будто я возвращал NSArray, хотя на самом деле я просто неправильно обращался к данным. Мне просто нужно было сделать [[self.data objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

0 голосов
/ 08 июля 2011

Ваша проблема здесь:

[self.data objectForKey:indexPath.row]

... потому что objectForKey: ищет имя ключа строки, например, "путь" или "идентификатор".Задание целого числа приведет к ошибке или случайному возврату.

Вместо этого вы хотите:

[self.data objectAtIndex:indexPath.row]

..., который будет возвращать управляемый объект по указанному индексу в массиве.

...