2013-10-16 51 views
9

我試圖從我的coredatabase中獲取單個對象,但它一直返回null。我的方法是基於另一種方法,它返回從我正在訪問的coredata對象的每個值..如何使用謂詞從Coredata中獲取單個對象

我從來沒有嘗試過這一點,並嘗試閱讀蘋果文件,但它只是沒有意義..這是我的方法看起來像

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

任何幫助讓我返回一個項目多數民衆贊成projID匹配projIDString將不勝感激。

+0

是'背景== nil' ?或者'executeFetchRequest'返回'nil'?在後一種情況下,「錯誤」的價值是什麼? –

+0

原來我沒有分配我的CoredataManagins類..我現在已經完成了,並正在接收一個錯誤。 「終止應用程序,由於未捕獲異常'NSInvalidArgumentException',原因:'未實現SQL生成謂詞:(任何ProjID CONTAINS [cd]」10000085「)'」 – HurkNburkS

+0

「任何ProjID CONTAINS [cd] ...」不是謂詞你在你的問題中顯示... –

回答

16

進口NSManagedObject(InstallProject)並取得一個對象就是這樣,

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

好吧,想通了,我沒有initalising我的coredatamanaging類,並在這樣做之後,這就是你的代碼返回「由於未捕獲的異常'NSInvalidArgumentException',終止應用程序'原因:'未實現的SQL生成謂詞:(任何ProjID CONTAINS [cd]」10000085 「)'」 – HurkNburkS

+0

好的直接使用[NSPredicate predicateWithFormat:@「ProjID ==%@」,projIDString]或者try,[NSPredicate predicateWithFormat:@「ProjID CONTAINS%@」,name]]; – karthika

+0

您應該在最後替換IF ELSE,並簡單地返回[fetchedObjects firstObject]。如果數組中沒有對象,它將返回零。 – CharleyXIV

11

怎麼樣的fetchLimitfetchRequest您可以設置到

的取限制指定的最大執行時請求應返回的對象數。

例如,在斯威夫特:

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

編輯:的sortDescriptors設置只是因爲我是用這個fetchRequest與NFRC,你可以執行fetchRequest太:

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 { 

}