2013-10-16 5 views
9

Ich versuche, ein einzelnes Objekt aus meiner Core-Datenbank zu holen, jedoch immer Null zurückgibt. Meine Methode basiert auf einer anderen Methode, die jeden Wert aus dem Coredata-Objekt zurückgibt, auf das ich zugreife.So holen Sie ein einzelnes Objekt aus Coredata mithilfe eines Prädikats

Ich habe dies vorher noch nie versucht und habe versucht, Äpfel Dokumente lesen, aber es macht einfach keinen Sinn .. das ist, was meine Methode sieht aus wie

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

jede Hilfe mich immer ein einzelnes Element zurückzukehren, das ist projid das projIDString paßt sehr geschätzt werden würde.

+0

Ist 'Kontext == nil' ? Oder gibt 'executeFetchRequest '' nil' zurück? Im letzteren Fall, was ist der Wert von "Fehler"? –

+0

stellt sich heraus, dass ich meine CoredataManagins-Klasse nicht zugewiesen habe .. Ich habe das jetzt getan und erhalte einen Fehler. "App aufgrund der nicht abgefangenen Ausnahme beenden 'NSInvalidArgumentException', Grund: 'nicht implementierte SQL-Generierung für Prädikat: (JEDES PROJID ENTHÄLT [cd]" 10000085 ")'" – HurkNburkS

+0

"JEDES PROJID ENTHÄLT [CD] ..." ist nicht das Prädikat Sie zeigten in Ihrer Frage ... –

Antwort

16

Import NSManagedObject (InstallProject) und ein Objekt wie folgt holen,

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

Okay, herausgefunden, dass ich meine Coredatamanagering-Klasse nicht initialisiert habe, und nachdem dies geschehen ist, hat der Code zurückgegeben: "App aufgrund der nicht abgefangenen Ausnahme beenden" NSInvalidArgumentException ', Grund:' nicht implementierte SQL-Generierung für Prädikat: (JEDES PROJID ENTHÄLT [cd] "10000085 ") '" – HurkNburkS

+0

okay, direkt mit [NSPredicate predicateWithFormat: @ "projID ==% @", projIDString] oder versuchen, [NSPredicate predicateWithFormat: @ "projID ENTHÄLT% @", name]]; – karthika

+0

Sie sollten die IF ELSE am Ende ersetzen und einfach [fetchedObjects firstObject] zurückgeben. Wenn im Array kein Objekt vorhanden ist, gibt es für Sie nil zurück. – CharleyXIV

11

Was ist mit dem fetchLimit auf die fetchRequest Sie, dass

Die Grenze holen gibt die maximale zu 1 einstellen Anzahl der Objekte, die eine Anfrage bei der Ausführung zurückgeben soll.

ZB. In Swift:

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

Edit: Die sortDescriptors werden nur gesetzt, weil ich diese fetchRequest mit einem NFRC mit wurde, können Sie einfach die fetchRequest ausführen zu:

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 { 

} 
Verwandte Themen