web-dev-qa-db-ja.com

述語を使用してCoreDataから単一のオブジェクトをフェッチする方法

コアデータベースから単一のオブジェクトをフェッチしようとしていますが、nullが返され続けます。私のメソッドは、アクセスしている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と一致する単一のアイテムを返すように私を助けていただければ幸いです。

9
HurkNburkS

NSManagedObject(InstallProject)をインポートし、次のように1つのオブジェクトをフェッチします。

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

}
17
karthika

fetchLimitfetchRequestはどうですか?1に設定できます

フェッチ制限は、実行時にリクエストが返すオブジェクトの最大数を指定します。

例えば。 In Swift:

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 {

}
11
JohnVanDijk