Objective c 核心数据:为什么我可以';我不能用谓词取任何东西

Objective c 核心数据:为什么我可以';我不能用谓词取任何东西,objective-c,core-data,Objective C,Core Data,代码有问题吗?我用这个谓词什么也找不到。注释掉谓词,然后我可以从实体“BankDetail”获取所有对象。所以我认为问题在于这两条线 // self.bankInfo.name is set in prepareForSegue in first view controller NSPredicate *predicate = [NSPredicate predicateWithFormat:@"info.name = %@",self.bankInfo.name]; [request setP

代码有问题吗?我用这个谓词什么也找不到。注释掉谓词,然后我可以从实体“BankDetail”获取所有对象。所以我认为问题在于这两条线

// self.bankInfo.name is set in prepareForSegue in first view controller
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"info.name = %@",self.bankInfo.name];
[request setPredicate:predicate];
我的模型包括两个实体,它们是一对一的关系

BankInfo.h

@class BankDetail;

@interface BankInfo : NSManagedObject

@property (nonatomic, retain) NSString * city;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * state;
@property (nonatomic, retain) BankDetail * detail;

@end
银行详情

@class BankInfo;

@interface BankDetail : NSManagedObject

@property (nonatomic, retain) NSString * closeDate;
@property (nonatomic, retain) NSString * updateDate;
@property (nonatomic, retain) NSString * zip;
@property (nonatomic, retain) NSString * acquiringInstitution;
@property (nonatomic, retain) BankInfo * info;

@end
编辑:

要提供更多详细信息,请执行以下操作:


  • self.bankInfo.name
    已明确设置,我将其记录在谓词行之前

  • 我在
    viewDidLoad
    中执行此操作:

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"BankDetail" inManagedObjectContext:context];
    NSLog(@"[entity description] is %@",[entity description]);
    
在控制台中获取此信息:

info = "(<NSRelationshipDescription: 0x6d3eb30>), name info, isOptional 1, isTransient 0, entity BankDetail, renamingIdentifier info, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, destination entity BankInfo, inverseRelationship detail, minCount 1, maxCount 1, isOrdered 0, deleteRule 2";
info=“(),名称信息,isOptional 1,isTransient 0,实体BankDetail,重命名标识符信息,验证谓词(\n),警告(\n),versionHashModifier(null)\n用户信息{\n},目标实体BankInfo,inverseRelationship详细信息,最小计数1,最大计数1,有序0,删除规则2”;
EDIT2:
结果是谓词没有任何错误。这个bug是由其他地方的一个粗心错误引起的(请参阅公认的答案,它是关于重命名的)。如果您对谓词有疑问,请忽略此帖子。

最后,我不得不使用一种不太优雅的解决方法。最后,我还为
BankDetail
添加了一个
name
属性。因此,一个BankInfo.name对应一个BankDetail.name。然后我使用谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",self.bankInfo.name];
request.predicate = [NSPredicate predicateWithFormat:@"hospital.name = %@", self.hospital.name];

它完成了我想要的:为相应的
BankInfo
对象获取一个
bankdail
对象。我想知道这到底是最好的做法。

最后,我不得不使用一种不那么优雅的解决方法。最后,我还为
BankDetail
添加了一个
name
属性。因此,一个BankInfo.name对应一个BankDetail.name。然后我使用谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",self.bankInfo.name];
request.predicate = [NSPredicate predicateWithFormat:@"hospital.name = %@", self.hospital.name];

它完成了我想要的:为相应的
BankInfo
对象获取一个
bankdail
对象。我想知道这是否是最好的做法。

问题可能是在谓词字符串中使用了
=
运算符

根据文档,类
运算符用于字符串比较,例如

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"info.name like %@",self.bankInfo.name];
文档还提供了一个遍历谓词中的关系的示例,以便您能够获得所需的结果。从
NSPredicate
文档中:

您可以为关系创建谓词,例如:

  • group.name,如“work*”

问题可能是在谓词字符串中使用了
=
运算符

根据文档,类
运算符用于字符串比较,例如

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"info.name like %@",self.bankInfo.name];
文档还提供了一个遍历谓词中的关系的示例,以便您能够获得所需的结果。从
NSPredicate
文档中:

您可以为关系创建谓词,例如:

  • group.name,如“work*”

据我看,你的谓词没有错。我在我的应用程序中有一个非常类似的应用程序,它运行良好:

@class Hospital;

@interface Patient : NSManagedObject
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) Hospital *hospital;

@end

我的谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",self.bankInfo.name];
request.predicate = [NSPredicate predicateWithFormat:@"hospital.name = %@", self.hospital.name];

所以你的代码没有问题。问题一定是因为
self.bankInfo
self.bankInfo.name
为空,或者是因为
bankdail
对象中的
info
中没有任何内容(未设置关系)。

据我所知,谓词没有问题。我在我的应用程序中有一个非常类似的应用程序,它运行良好:

@class Hospital;

@interface Patient : NSManagedObject
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) Hospital *hospital;

@end

我的谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",self.bankInfo.name];
request.predicate = [NSPredicate predicateWithFormat:@"hospital.name = %@", self.hospital.name];

所以你的代码没有问题。问题一定是因为
self.bankInfo
self.bankInfo.name
为空,或者是因为
bankdail
对象中的
info
中没有任何内容(未设置关系)。

您最初发布的谓词代码是正确的。下面是一个测试基本原理的快速测试项目:(正确记录“银行名称”)


您最初发布的谓词代码是正确的。下面是一个测试基本原理的快速测试项目:(正确记录“银行名称”)


如果它是一对一关系,并且您已经有了要匹配的
self.bankInfo.name
字符串,为什么不获取具有该名称的
bankInfo
对象并访问该对象的
.detail
属性?这就是恋爱的全部意义,不是吗


但是,谓词应该有效。什么是self.bankInfo
?你确定
self.bankinfo.name
是一个有效的字符串吗?

如果它是一对一的关系,并且你已经有了想要匹配的
self.bankinfo.name
字符串,为什么不取
bankinfo
对象并访问该对象的
.detail
属性?这就是恋爱的全部意义,不是吗


但是,谓词应该有效。什么是self.bankInfo
?您确定
self.bankinfo.name
是有效字符串吗?

您的谓词结构正常。见我的另一个简单的项目,以证明基本原则

根据对其他答案的响应,听起来您正在将此
NSFetchRequest
传递给
NSFetchedResultsController
,并使用其行为确定谓词不起作用

我的第一个建议是记录谓词,看看它是否如预期的那样:

NSLog(@"%@", predicate);
如果没有问题,那么为了测试谓词不起作用的理论,您应该在生成请求后立即执行
NSFetchRequest
,并检查结果,例如

// self.bankInfo.name is set in prepareForSegue in first view controller
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"info.name = %@",self.bankInfo.name];
[request setPredicate:predicate];

NSArray *results = [myMangedObjectContext executeFetchRequest:request error:nil];
如果这不能说明问题,那么我建议您从请求中删除谓词,执行请求,并使用以下日志语句检查完整结果:

NSLog(@"%@", self.bankInfo.name);
NSLog(@"%@", [results valueForKeyPath:@"info.name"]);
最后一条log语句实际上记录了所有银行名称的数组,这样您就可以看到