我的 CoreData 数据库中存在严重问题。我在 2 个表之间创建了一个一对多的关系,并在包含所有唯一值的表上添加了一个获取的属性。所有代码在 iOS 5 中都按预期工作,但在 iOS 6 中我收到以下错误:



为 Fetched 属性定义的谓词是:



我已经定义了数组以返回所有接收我的 Tour 类中的所有值。

您是否知道 iOS 6 中 Fetched Properties 的任何问题?因为我无法理解这在 iOS 5 中没有问题但在 iOS6 中失败。

请参阅下面的所有其他相关代码:

下面的代码是我检索所有记录的方式:

- (void)loadRecordsFromCoreData {
    [self.managedObjectContext performBlockAndWait:^{
        [self.managedObjectContext reset];
        NSError *error = nil;
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        NSEntityDescription *entityDescription = [NSEntityDescription entityForName:NSStringFromClass([Tour class]) inManagedObjectContext:self.managedObjectContext];
        [request setEntity:entityDescription];
        [request setResultType:NSManagedObjectResultType];
        [request setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"tour_id" ascending:YES]]];
        self.tours = [self.managedObjectContext executeFetchRequest:request error:&error];
    }];

下面的代码适用于我定义的 NSManagedObjects:

- 旅游
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class TourDetail;

@interface Tour : NSManagedObject

@property (nonatomic, retain) NSNumber * tour_id;
@property (nonatomic, retain) NSString * background_url;
@property (nonatomic, retain) NSString * summary;
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSSet *tourdetails_tour;

@property (nonatomic, retain) NSArray *tourDetails;
@end

@interface Tour (CoreDataGeneratedAccessors)

- (void)addTourdetails_tourObject:(TourDetail *)value;
- (void)removeTourdetails_tourObject:(TourDetail *)value;
- (void)addTourdetails_tour:(NSSet *)values;
- (void)removeTourdetails_tour:(NSSet *)values;

@end
}
#import "Tour.h"
#import "TourDetail.h"


@implementation Tour

@dynamic tour_id;
@dynamic background_url;
@dynamic summary;
@dynamic title;
@dynamic tourdetails_tour;
@dynamic tourDetails;

@end

-- 旅游详情
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Tour;

@interface TourDetail : NSManagedObject

@property (nonatomic, retain) NSNumber * id;
@property (nonatomic, retain) NSNumber * tour_id;
@property (nonatomic, retain) NSNumber * lattitude;
@property (nonatomic, retain) NSNumber * longitude;
@property (nonatomic, retain) NSString * audiofile;
@property (nonatomic, retain) NSString * detail;
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) Tour *tour_tourdetails;

@end

#import "TourDetail.h"
#import "Tour.h"


@implementation TourDetail

@dynamic id;
@dynamic tour_id;
@dynamic lattitude;
@dynamic longitude;
@dynamic audiofile;
@dynamic detail;
@dynamic title;
@dynamic tour_tourdetails;

@end

您可以提供的任何建议将不胜感激:) 以及您可能拥有的有关如何最好地定义获取的属性的任何示例?

谢谢,
迈克尔

最佳答案

你在这里使用的代码不干净

- (void)loadRecordsFromCoreData {
    [self.managedObjectContext performBlockAndWait:^{
        [self.managedObjectContext reset];
        NSError *error = nil;
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        NSEntityDescription *entityDescription = [NSEntityDescription entityForName:NSStringFromClass([Tour class]) inManagedObjectContext:self.managedObjectContext];
        [request setEntity:entityDescription];
        [request setResultType:NSManagedObjectResultType];
        [request setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"tour_id" ascending:YES]]];
        self.tours = [self.managedObjectContext executeFetchRequest:request error:&error];
    }];

事实上,这有点令人困惑。

您调用一个方法,该方法调用一个托管对象上下文,该上下文在同步块(synchronized block)中进一步调用自身,该块无缘无故地重置自身,在块外设置一个属性“self.tours”。都很奇怪。你能解释一下你为什么要这样做吗?

试试这个。
+(void)loadRecordsWithCompletion:(void(^)(NSArray *records, NSError *error))completion {
    NSManagedObjectContext *context; //Your context
    NSError *error;
    NSSortDescriptor *sortDesc = [NSSortDescriptor sortDescriptorWithKey:@"attribute" ascending:YES];
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"EntityName"];
    [request setSortDescriptors:@[sortDesc]];
    NSArray *records = [context executeFetchRequest:request
                                              error:&error];
    completion(records, error);
}

关于ios - 获取的属性适用于 iOS5 但不适用于 iOS6,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14776157/

10-13 09:03
查看更多