NSFetchRequest 返回具有 <invalid> 类型元素的数组

Posted

技术标签:

【中文标题】NSFetchRequest 返回具有 <invalid> 类型元素的数组【英文标题】:NSFetchRequest returning array with elements of type <invalid> 【发布时间】:2014-09-17 18:30:07 【问题描述】:

我正在编写的 Core Data 应用程序出现了一个奇怪的问题。我正在尝试使用一个简单的谓词执行 NSFetchRequest,该谓词返回一个包含我期望的元素数量的数组,但每个元素的类型都是无效的。

此请求的谓词是字符串比较。我已经验证 Core Data 实体在命令行上使用 sqlite3 设置了这个特定字段,并且我已经确认我传递给谓词的字符串值是正确的。

为了安全起见,我什至完全删除了谓词。当我这样做时,我会返回一个数组,该数组的元素总数与我正在获取的核心数据实体的整个数据集匹配,但同样每个元素都有一种无效类型。

设置断点并检查无效元素后,我在控制台中得到了这个:

Printing description of [0]:
(<invalid>) [0] = <error: expected ']'
error: 1 errors parsing expression
>

在应用程序的另一部分,我正在针对同一个实体执行类似的请求(没有谓词,只是获取整个集合)并且它工作正常。我不知道如何继续对此进行故障排除,而且似乎无法在 Google 上找到任何信息来说明提取请求返回这些结果的原因。

以下是相关代码:

//appdelegate
- (NSManagedObjectContext *)managedObjectContext 
    if (_managedObjectContext != nil) 
        return _managedObjectContext;
    

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) 
        _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSMainQueueConcurrencyType];
        [_managedObjectContext setPersistentStoreCoordinator: coordinator];
     

    return _managedObjectContext;




//ClientDetailModel.m
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSError *error;
NSEntityDescription *ed = [NSEntityDescription entityForName:@"Clients" inManagedObjectContext: context];
NSFetchRequest *clientReq = [[NSFetchRequest alloc] init];
[clientReq setEntity: ed];

NSString *predicateString = [NSString stringWithFormat: @"%@\"%@\"", @"uuid == ", clientUuid];
[clientReq setPredicate: [NSPredicate predicateWithFormat: predicateString]];
NSArray *results = [context executeFetchRequest: clientReq error: &error];

以及客户核心数据模型:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Orders;

@interface Clients : NSManagedObject

@property (nonatomic, retain) NSNumber * account;
@property (nonatomic, retain) NSString * address;
@property (nonatomic, retain) NSString * city;
@property (nonatomic, retain) NSString * company;
@property (nonatomic, retain) NSString * contact;
@property (nonatomic, retain) NSString * email;
@property (nonatomic, retain) NSNumber * email1on;
@property (nonatomic, retain) NSString * email2;
@property (nonatomic, retain) NSNumber * email2on;
@property (nonatomic, retain) NSString * fax;
@property (nonatomic, retain) NSDate * last_synced;
@property (nonatomic, retain) NSDate * last_updated;
@property (nonatomic, retain) NSString * phone;
@property (nonatomic, retain) NSNumber * portal_id;
@property (nonatomic, retain) NSString * postal_code;
@property (nonatomic, retain) NSString * province;
@property (nonatomic, retain) NSNumber * sync_failures;
@property (nonatomic, retain) NSString * uuid;
@property (nonatomic, retain) NSString * client_hash;
@property (nonatomic, retain) NSSet *client_orders;
@end

@interface Clients (CoreDataGeneratedAccessors)

- (void)addClient_ordersObject:(Orders *)value;
- (void)removeClient_ordersObject:(Orders *)value;
- (void)addClient_orders:(NSSet *)values;
- (void)removeClient_orders:(NSSet *)values;

@end

【问题讨论】:

你为什么使用这种谓词格式?你为什么不简单地做,[NSPredicate predicateWithFormat:@"uuid = %@", clientUuid] 我遇到了麻烦,不记得确切的错误,直到我在 clientUuid 周围引入了“”。我认为这有点奇怪,但它解决了问题。我想我仍然可以通过以下方式清理它:[NSPredicate predicateWithFormat:@"uuid = \"%@\"", clientUuid];。感谢您的建议。 能否请您多发一些关于核心数据模型相关部分的内容。 我已经为我要获取的实体发布了 .h 文件。如果您还想要其他东西,尽管问。 【参考方案1】:

事实证明,对于从 Core Data 返回的对象,invalid 是一个完全有效的类型。事实上,只是将类型无效的对象转换为 NSManagedObject 解决了“问题”。

NSManagedObject *client = [results objectAtIndex: 0];

我很困惑为什么当一切都正常时数据类型会显示为无效,但我想我应该只是“思考不同”。

【讨论】:

这是调试器和/或托管对象的-description 方法的问题。 是的,经过一段时间的思考后,我有点猜测。只是出于好奇,如果有人可以对正在发生的事情提供更全面的解释,那就太好了。作为记录,这发生在 xCode 5.1 中。

以上是关于NSFetchRequest 返回具有 <invalid> 类型元素的数组的主要内容,如果未能解决你的问题,请参考以下文章

NSfetchRequest 啥都不返回

具有不同属性的 NSFetchRequest

iPhone 核心数据:具有不同属性和字母部分的 NSFetchRequest

具有不同记录和 UIPickerView 的 NSFetchRequest

NSFetchRequest 未捕获具有更改属性的对象

NSFetchRequest 具有一对一关系属性 == YES 谓词错误地获取每个实体