【问题标题】:How to fetch a single object from Coredata using a predicate如何使用谓词从 Coredata 中获取单个对象
【发布时间】:2013-10-24 04:48:17
【问题描述】:

我正在尝试从我的核心数据库中获取单个对象,但是它一直返回 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 匹配的单个项目将不胜感激。

【问题讨论】:

  • context == nil?还是executeFetchRequest 返回nil?在后一种情况下,error 的值是多少?
  • 原来我没有分配我的 CoredataManagins 类。我现在已经这样做了,并且收到了一个错误。 “由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'未实现的谓词生成SQL:(ANY ProjID CONTAINS [cd]“10000085”)'”
  • "ANY ProjID CONTAINS[cd] ..." 不是您在问题中显示的谓词 ...
  • 哎呀..我使用了下面答案中的错误。这就是我上面的代码生成的。 "*** 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'keypath ProjID not found in entity '"
  • 这意味着您没有为核心数据实体“InstallProject”定义属性“ProjID”。也许是一个小错字?

标签: ios objective-c core-data nspredicate


【解决方案1】:

导入 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;  

}

【讨论】:

  • 好的,发现我没有初始化我的 coredatamanaging 类,这样做之后,这就是您的代码返回的内容“由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'未实现的谓词 SQL 生成:(任何ProjID CONTAINS[cd] "10000085")'"
  • 好吧直接使用[NSPredicate predicateWithFormat:@"ProjID==%@", projIDString] 或者试试,[NSPredicate predicateWithFormat:@"ProjID CONTAINS %@",name]];
  • 您应该替换最后的 IF ELSE 并简单地返回 [fetchedObjects firstObject]。如果数组中没有对象,它将为您返回 nil。
【解决方案2】:

fetchRequest 上的 fetchLimit 怎么样?您可以将其设置为 1

获取限制指定请求在执行时应返回的最大对象数。

例如在斯威夫特:

let fetchRequest = NSFetchRequest(entityName: "Cart")
fetchRequest.fetchLimit = 1
fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(Cart.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.execute(fetchRequest) as! [Cart]
} catch {
  
}

【讨论】:

    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 2014-10-15
    • 2021-08-22
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    相关资源
    最近更新 更多