2011-07-07 12 views
5

Z jakiegoś powodu wszystkie atrybuty maszynowe NSString są zwracane jako NSArrays w obiekcie mojego artykułu. Oto moja funkcja ich pobierania: Dane podstawowe zwracające NSArrays zamiast NSStrings

- (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; 
}
Nie utworzyłem dla nich NSManagedObjectModel, a zamiast tego uzyskuję do nich dostęp za pomocą 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"]; 

Kiedy patrzę na to w okienku zmiennych, na path i id widzę (__NSArrayI *) ... Variable is not a CFString. Drukowanie opis jednego z nich również wypisuje nawias używany podczas drukowania tablic.

Zastanawiam się, czy to może być deskryptor sortowania? Sprawdziłem dwukrotnie, czy dane wprowadzane do tych obiektów są poprawnie wpisane, a baza danych SQLite, której używam do tworzenia kopii zapasowych wszystkich elementów, wyświetla ciągi znaków.

Próbowałem ponownie zainstalować aplikację w symulatorze i zresetować go. Nadal dostaję NSArray zamiast NSString.

Naprawdę nie wiem, co się tutaj dzieje. Każda pomoc będzie doceniona.

EDYCJA: Właśnie znalazłem coś innego interesującego. Robię kolejną kontrolę, aby sprawdzić, czy artykuł został zapisany, i tym razem nie dostaję NSArray dla ścieżki artykułu:

- (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; 
}

Teraz jestem naprawdę zdezorientowany. Którzy chętni?

Odpowiedz

0

Znalazłem problem. Zmieniłem strukturę danych dla mojego stolika, więc self.data to tablica tablic ... i tylko z jednym obiektem wyglądało to tak, jakbym odzyskała NSArray, podczas gdy w rzeczywistości właśnie miałem dostęp do danych źle. Właśnie musiałem zrobić [[self.data objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

0

Twój problem jest tutaj:

[self.data objectForKey:indexPath.row] 

... bo objectForKey: szuka nazwę klucza np smyczkową "ścieżka" lub "id". Podanie jej liczby całkowitej spowoduje błąd lub losowy zwrot.

Zamiast tego chcesz:

[self.data objectAtIndex:indexPath.row] 

... który powróci zarządzanego obiektu w danym indeksie w tablicy.

+0

Whoops! To literówka w pytaniu. Używam objectAtIndex. Naprawianie teraz. – MishieMoo

+0

Tak, zastanawiałem się, jak to się skompilowało. – TechZen

Powiązane problemy