2013-10-16 14 views
9

Próbuję pobrać pojedynczy obiekt z mojej bazy tekstowej, ale on zwraca wartość null. Moja metoda jest oparta na innej metodzie, która zwraca każdą wartość z obiektu coredata, do którego uzyskuję dostęp.Jak pobrać pojedynczy obiekt z Coredata przy użyciu predykatu

Nigdy wcześniej tego nie próbowałem i próbowałem czytać dokumenty jabłek, ale to nie ma sensu .. to jest moja metoda wygląda jak

- (NSMutableArray *)readSelectedInstall:(NSString *)projIDString { 
    NSManagedObjectContext *context = [self managedObjectContext]; 

    if (context == nil) { 
     NSLog(@"Nil"); 
    } 
    else { 


     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"InstallProject" inManagedObjectContext:context]; 
     [fetchRequest setEntity:entity]; 

     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ProjID==%@", projIDString]; 
     [fetchRequest setPredicate:predicate]; 

     NSError *error; 

     NSMutableArray *installProjectDictionaryArray = [[NSMutableArray alloc] init]; 


     NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; 
     for (InstallProject *installProj in fetchedObjects) { 

      NSMutableDictionary *tempInstallProjectDictionaryArray = [[ NSMutableDictionary alloc] init]; 

      [tempInstallProjectDictionaryArray setObject:installProj.companyName forKey:@"CompanyName"]; 
      [tempInstallProjectDictionaryArray setObject:installProj.projNo forKey:@"ProjNo"]; 
      [tempInstallProjectDictionaryArray setObject:installProj.projID forKey:@"ProjID"]; 

      [installProjectDictionaryArray addObject:tempInstallProjectDictionaryArray]; 
     } 

     return installProjectDictionaryArray; 
    } 
    return nil; 
} 

każda pomoc w uzyskaniu mi zwrotu pojedynczego przedmiotu, który projID pasuje do projIDString byłby bardzo doceniony.

+0

jest 'kontekstowego == zerowe ? Lub robi 'executeFetchRequest' return' nil'? W tym ostatnim przypadku, jaka jest wartość "błędu"? –

+0

Okazuje się, że nie przydzielałem mojej klasy CoredataManagins. Zrobiłem to teraz i otrzymuję błąd. "Kończenie aplikacji z powodu nieprzechwyconego wyjątku" NSInvalidArgumentException ", powód:" niezatwierdzone generowanie kodu SQL dla predykatu: (DOWOLNY ProjID ZAWIERA [cd] "10000085") "" – HurkNburkS

+0

"DOWOLNY PROJEKT ZAWIERA [cd] ..." nie jest predykatem, który pokazałeś na swoje pytanie ... –

Odpowiedz

16

importu NSManagedObject (InstallProject) i pobrać jeden obiekt jak ten,

-(InstallProject *)readSelectedInstall:(NSString *)projIDString 
{ 

    NSArray *fetchedObjects; 
    NSManagedObjectContext *context = [self managedObjectContext]; 
    NSFetchRequest *fetch = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"InstallProject" inManagedObjectContext: context]; 
    [fetch setEntity:entityDescription]; 
    [fetch setPredicate:[NSPredicate predicateWithFormat:@"(ANY ProjID contains[cd] %@)",projIDString]]; 
    NSError * error = nil; 
    fetchedObjects = [context executeFetchRequest:fetch error:&error]; 

    if([fetchedObjects count] == 1) 
    return [fetchedObjects objectAtIndex:0]; 
    else 
    return nil; 

} 
+0

OK, zorientowałem się, że nie inicjalizowałem mojej klasy coredatamanaging, a po wykonaniu tego właśnie zwrócił swój kod "Kończenie aplikacji z powodu niezamkniętego wyjątku" NSInvalidArgumentException ", powód:" niezaimplementowane generowanie kodu SQL dla predykatu: (DOWOLNY PROJEDZ ZAWIERA [cd] "10000085 ")" " – HurkNburkS

+0

OK bezpośrednio użyj [NSPredicate predicateWithFormat: @" ProjID ==% @ ", projIDString] lub spróbuj, [NSPredicate predicateWithFormat: @" ProjID ZAWIERA% @ ", nazwa]]; – karthika

+0

Powinieneś zamienić IF ELSE na końcu i po prostu wrócić [fetchedObjects firstObject]. Jeśli nie ma obiektu w tablicy, zwróci on zero dla ciebie. – CharleyXIV

11

Co o fetchLimit w sprawie fetchRequest Można ustawić, że do

FETCH limitu określa maksymalną liczba obiektów, które żądanie powinno zwrócić po wykonaniu.

Np. W SWIFT:

let fetchRequest = NSFetchRequest(entityName: "Cart") 
fetchRequest.fetchLimit = 1 
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)] 

Edit: W sortDescriptors są ustawione tylko dlatego, że był przy tym fetchRequest z NFRC, można po prostu wykonać fetchRequest też:

do { 
    let fetchRequest = NSFetchRequest(entityName: "Cart") 
    fetchRequest.fetchLimit = 1 
    fetchRequest.predicate = NSPredicate(format: "name == %@", mainCart) 
    var objects: [Cart] 
    try objects = mainMoc.executeFetchRequest(fetchRequest) as! [Cart] 
} catch { 

} 
Powiązane problemy