核心数据:'ALL或ANY运算符的左侧必须是NSArray或NSSet。

时间:2014-02-27 23:49:36

标签: ios iphone core-data nspredicate

如果今天的对象已经存在,我有一个查询Core Data的方法。

我的代码:

CoreDataHelper *cdh = [(MRMedSafeAppDelegate *) [[UIApplication sharedApplication] delegate] cdh];
NSManagedObjectContext *context = [cdh context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"BMI" inManagedObjectContext:context];
[request setEntity:entity];

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:day];
[comps setMonth:month];
[comps setYear:year];
NSDate *today = [[NSCalendar currentCalendar] dateFromComponents:comps];

NSLog(@"patient: %@", patient);

NSPredicate *pred = [NSPredicate predicateWithFormat:@"(patient == %@) AND (erstellt_am == %@)", patient, today];
[request setPredicate:pred];

NSError *error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];

数据模型:

bmi.patient是与患者的To-One关系。

我不明白什么是错的,我的谓词中甚至没有ALL或ANY子句。

有人可以启发我吗?

2 个答案:

答案 0 :(得分:0)

此错误表示有两个线程正在尝试访问数据库。我们不要忘记CoreData是非线程安全的。

检查您的线程和对数据库的访问权限,因为线程中存在竞争以访问数据库。

希望这有助于解决您的问题。如果从不同的线程访问数据库,请尝试使用完成处理程序或KVO通知,以便管理对数据库的线程访问。

答案 1 :(得分:0)

如果问题是从不同的线程访问核心数据,您可以确保使用以下UIManagedObjectContext方法之一使用正确的线程:

context.performBlockAndWait(block: () -> Void())
context.performBlock(block: () -> Void())