核心数据NSFetchedResultsController:在设备上调试时出错(无法为谓词生成SQL)

时间:2011-06-27 22:36:22

标签: objective-c core-data nsdate nspredicate

当我在我的设备上调试我的应用程序时,我有一个奇怪的例外。模拟器中的调试按预期工作。

  • 我使用核心数据存储我的数据
  • 模型中的关系如下:位置< - > LocationDetails - >> HAPPYHOUR
  • 我使用NSFetchedResultsController来填充UITableView
  • 我对Objective-c develpoment来说也很陌生

我需要有一个SUBQUERY来获取HappyHour实体的属性。

像这样:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(0 != SUBQUERY(details.%K, $hh, ($hh.startTime < %@) AND ($hh.endTime > %@)).@count)", weekdayString, theDate, theDate];

仅在DEVICE上我收到此错误/例外:

* 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'无法为谓词生成SQL(0!= SUBQUERY(details.hh_montag,$ hh,$ hh.startTime&lt; CAST) (316482000.000000,“NSDate”)AND $ hh.endTime&gt; CAST(316482000.000000,“NSDate”))。@ count)(RHS问题)'

0 CoreFoundation 0x32cf964f __exceptionPreprocess + 114
    1 libobjc.A.dylib 0x3313cc5d objc_exception_throw + 24
    2 CoreData 0x3228a829 - [NSSQLGenerator newSQLStatementForFetchRequest:ignoreInheritance:countOnly:nestingLevel:] + 688
    3 CoreData 0x3228a2eb - [NSSQLAdapter _newSelectStatementWithFetchRequest:ignoreInheritance:] + 378
    4 CoreData 0x3228a169 - [NSSQLAdapter newSelectStatementWithFetchRequest:] + 16
    5 CoreData 0x3228a005 - [NSSQLCore newRowsForFetchPlan:] + 288
    6 CoreData 0x322892c5 - [NSSQLCore objectsForFetchRequest:inContext:] + 420
    7 CoreData 0x32288875 - [NSSQLCore executeRequest:withContext:error:] + 304
    8 CoreData 0x32287dd5 - [NSPersistentStoreCoordinator executeRequest:withContext:error:] + 896
    9 CoreData 0x3228669f - [NSManagedObjectContext executeFetchRequest:错误:] + 374
    10 CoreData 0x322b9d7f - [NSFetchedResultsController performFetch:] + 766
    11 HappyHourRadar 0x0003e723 - [ResultViewController viewDidLoad] + 86
...
抛出'NSException'实例后终止调用 收到的信号:SIGABRT(已中止)

处理以退出代码-1

结束

[ResultViewController viewDidLoad] +86

我打电话

[self fetchedResultsController] performFetch:&amp; error]


在控制台中我也收到此消息:

无法加载符号文件:无法加载符号文件:警告:无法读取/Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.3(8J2)/ Symbols/Developer/usr/lib/libXcodeDebuggerSupport的符号。 dylib(找不到文件)。


由于我没有找到任何可以帮助我的东西,我想这可能是非常奇怪的东西,或者我只是搞砸了一些相当标准的东西,我找不到因为我有限的目标c背景...

无论如何,如果有人能给出提示,我会很高兴,所以我可以继续而不必将整个应用程序模型层重写为脏东西(比如获取所有条目并将它们保存在数组中并处理过滤器函数)。像那样;。)


编辑:

这是模型图。从这个自动生成的模型文件。

Link to Image

生成HappyHour类:

@interface HappyHour :  NSManagedObject  
{
}

@property (nonatomic, retain) NSDate * endTime;
@property (nonatomic, retain) NSDate * startTime;

@end

1 个答案:

答案 0 :(得分:1)

我明白了。希望这可以帮助那些盲人,疲倦或其他任何人。 ;)

这些粗体标记的段落显然不匹配:

  • 由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'无法为谓词生成SQL(0!= SUBQUERY(详情。 hh_montag ,$ hh,$ hh.startTime&lt; CAST( 316482000.000000,“NSDate”)AND $ hh.endTime&gt; CAST(316482000.000000,“NSDate”))。@ count)(RHS问题)'

  

@class Location;

     

@interface LocationDetails:   NSManagedObject {}

     

@property(nonatomic,retain)NSString * phone;

     

...

     

@property(非原子,保留)NSSet * hh_monday ;

     

...

     

@end

最终的解决方案是:

NSTimeInterval secondsPerDay = 7 * 60 * 60;
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"EEEE"];

SOLUTION >> [f setLocale: [[[NSLocale alloc] initWithLocaleIdentifier:@"en_UK"] autorelease]];

NSString *weekdayString = [NSString stringWithFormat:@"hh_%@", [[f stringFromDate:[NSDate dateWithTimeIntervalSinceNow:-secondsPerDay]] lowercaseString]];

黄金法则

请始终牢记,设备在不同的位置/语言中的工作方式会有所不同。

因此,可能会避免从位置/语言相关的类(如NSDate(Formatter))生成键选择器(?)。
或者确保这些类为每种情况返回相同的值。 (希望我已经用这个解决方案处理了一些问题......如果我弄错了,请纠正我。)