【问题标题】:How can you reference child entity name in a predicate for a fetch request of the parent entity?如何在谓词中为父实体的获取请求引用子实体名称?
【发布时间】:2010-12-07 10:50:27
【问题描述】:

我需要为抽象基础对象创建一个复杂的谓词。我想对不同的继承实体进行单独的谓词查询并关闭子实体类型,下面的示例是我想做的,但是,我无法找到引用实体名称或输入的方法谓词。

NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"MyCommonObjectBase" inManagedObjectContext:myContext];

NSPredicate *subclassAPredicate = [NSPredicate predicateWithFormat:@"someValue > %@ && entityName = %@", 100, @"SubclassA"];
NSPredicate *subclassBPredicate = [NSPredicate predicateWithFormat:@"someValue < %@ && entityName = %@", 50, @"SubclassB"];

request.predicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:subclassAPredicate, subclassBPredicate, nil]];

【问题讨论】:

    标签: iphone iphone-sdk-3.0 core-data


    【解决方案1】:

    这里是在黑暗中开枪,但是在谓词中使用className 值呢?

    NSPredicate *subclassAPredicate = [NSPredicate predicateWithFormat:@"someValue > %d AND child.className = %@", 100, @"SubclassA"];
    

    (请注意,您的谓词格式有误。您使用%@ 尝试替换为整数值(100)。%@ 仅用于对象。使用%d(或一些其他风格)用于基元)

    编辑找到了!

    你会想要这样做:

    NSPredice * p = [NSPredicate predicateWithFormat:@"entity.name = %@", @"SubclassA"];
    

    我刚刚在我的一个应用上进行了测试,它似乎可以工作。

    -另一个编辑-

    这是我运行的测试,它似乎有效:

    NSManagedObjectContext * c = [self managedObjectContext];
    NSFetchRequest * f = [[NSFetchRequest alloc] init];
    [f setEntity:[NSEntityDescription entityForName:@"AbstractFolder" inManagedObjectContext:c]];
    [f setPredicate:[NSPredicate predicateWithFormat:@"entity.name = %@", @"DefaultFolder"]];
    NSError * e = nil;
    NSArray * a = [c executeFetchRequest:f error:&e];
    [f release];
    NSLog(@"%@", a);
    

    当我运行它时,a 记录了两个 NSManagedObjects,两个都是 @"DefaultFolder" 品种(这是我所期待的)。 (AbstractFolder 是一个抽象实体。从它继承的子实体之一是DefaultFolder

    【讨论】:

    • 我会试一试,谢谢。是的,这是为了说明而概括一些生产代码的错字。
    • 不走运,className 不是有效的密钥路径。另外,我正在寻找 self 的实体名称而不是子实体,只是为了澄清。
    • 我没有看到相同的结果,当我添加时我仍然收到错误消息“keypath entity.name not found in entity”。
    • @Greg - 我刚刚用 iPhone 应用程序试了一下,发现了一些奇怪的东西。如果您的商店类型是 NSBinaryStoreType,它将起作用,但如果它是 NSSQLiteStoreType,则不起作用。我上面的代码在 NSXMLStoreType 上运行。我会继续寻找在 SQLiteStoreType 上执行此操作的方法。
    • 我已经向 Apple 提交了一份错误报告,希望他们能在某个时候修复它。
    【解决方案2】:

    将谓词与我知道的实体相关联的唯一方法是:

    NSPredicate * predicate = [NSPredicate predicateWithFormat: @"(%K == %@)", fieldName, fieldValue, nil];
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    [request setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext]];
    [request setPredicate:predicate];
    

    也许您指的是字段名称?

    编辑:实体与请求相关联,而不是与谓词相关联。

    【讨论】:

      【解决方案3】:

      我在http://bugreport.apple.com 问题编号 7318897 收到了 Apple 的回复:

      entity.name 不是模型属性,因此不合法。它在二进制存储上偶然工作。获取子实体的正确方法是在 NSFetchRequest 上这样做并使用 setIncludesSubentities 或不使用。

      因此,似乎正确的解决方案是有单独的获取请求并在执行后合并结果集。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多