升级到XCode + iOS 4.2后的代码数据问题

时间:2010-12-07 17:21:45

标签: iphone core-data

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Thread" inManagedObjectContext:managedObjectContext];

这条线似乎不再起作用了(我很确定它的那一行)。

我似乎无法解决问题。该应用程序在Xcode与iOS 4.1上完美配合,现在在控制台中出现此错误:

2010-12-07 17:12:27.552 SMSApp[9222:207] +[ persistentStoreCoordinator]: unrecognized selector sent to class 0x5b14580
2010-12-07 17:12:27.553 SMSApp[9222:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[ persistentStoreCoordinator]: unrecognized selector sent to class 0x5b14580'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x01547be9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x0169c5c2 objc_exception_throw + 47
    2   CoreFoundation                      0x015497bb +[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x014b9366 ___forwarding___ + 966
    4   CoreFoundation                      0x014b8f22 _CF_forwarding_prep_0 + 50
    5   CoreData                            0x00e6f3ca +[NSEntityDescription entityForName:inManagedObjectContext:] + 42
    6   SMSApp                              0x000046b9 -[MessagesRootViewController reloadMessages:] + 146
    7   SMSApp                              0x00004a09 -[MessagesRootViewController viewDidLoad] + 85
    8   UIKit                               0x0052265e -[UIViewController view] + 179
    9   UIKit                               0x00520a57 -[UIViewController contentScrollView] + 42
    10  UIKit                               0x00531201 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 48
    11  UIKit                               0x0052f831 -[UINavigationController _layoutViewController:] + 43
    12  UIKit                               0x00530b4c -[UINavigationController _startTransition:fromViewController:toViewController:] + 524
    13  UIKit                               0x0052b606 -[UINavigationController _startDeferredTransitionIfNeeded] + 266
    14  UIKit                               0x00643e01 -[UILayoutContainerView layoutSubviews] + 226
    15  QuartzCore                          0x010b4451 -[CALayer layoutSublayers] + 181
    16  QuartzCore                          0x010b417c CALayerLayoutIfNeeded + 220
    17  QuartzCore                          0x010ad37c _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310
    18  QuartzCore                          0x010ad0d0 _ZN2CA11Transaction6commitEv + 292
    19  UIKit                               0x0047719f -[UIApplication _reportAppLaunchFinished] + 39
    20  UIKit                               0x00477659 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 690
    21  UIKit                               0x00481db2 -[UIApplication handleEvent:withNewEvent:] + 1533
    22  UIKit                               0x0047a202 -[UIApplication sendEvent:] + 71
    23  UIKit                               0x0047f732 _UIApplicationHandleEvent + 7576
    24  GraphicsServices                    0x01b2ca36 PurpleEventCallback + 1550
    25  CoreFoundation                      0x01529064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    26  CoreFoundation                      0x014896f7 __CFRunLoopDoSource1 + 215
    27  CoreFoundation                      0x01486983 __CFRunLoopRun + 979
    28  CoreFoundation                      0x01486240 CFRunLoopRunSpecific + 208
    29  CoreFoundation                      0x01486161 CFRunLoopRunInMode + 97
    30  UIKit                               0x00476fa8 -[UIApplication _run] + 636
    31  UIKit                               0x0048342e UIApplicationMain + 1160
    32  SMSApp                              0x000025c4 main + 102
    33  SMSApp                              0x00002555 start + 53
)
terminate called after throwing an instance of 'NSException'

知道这个错误来自何处或导致错误?

也是为了让您知道,使用iOS 4.2升级到XCode会导致某些文件从我的项目中删除。我不知道为什么会这样,是不是因为它们是链接文件而实际上并不是我不知道的文件夹。

有什么想法吗?

由于

//编辑

此方法位于AppDelegate中:

- (NSManagedObjectContext *)managedObjectContext {

    if (managedObjectContext_ != nil) {
        return managedObjectContext_;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        managedObjectContext_ = [[NSManagedObjectContext alloc] init];
        [managedObjectContext_ setPersistentStoreCoordinator:coordinator];
    }
    return managedObjectContext_;
}

//再次编辑

- (void)reloadMessages:(NSNotification *)notification {
    NSLog(@"RECIEVED NEW MESSAGES TO MessagesRootViewController");

    NSLog(@"%@",managedObjectContext);

    // we need to get the threads from the database...
    NSFetchRequest *theReq = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Thread" inManagedObjectContext:self.managedObjectContext];
    [theReq setEntity:entity];

    threads = [NSArray arrayWithArray:[managedObjectContext executeFetchRequest:theReq error:nil]];

    [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

    if(notification != nil){ // if its been caused by a notification
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"New Message" message:@"A new message has been received" delegate:nil cancelButtonTitle:@"Thanks" otherButtonTitles:nil];
        [alert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:NO];
        [alert release];
    }
}

//编辑3

如果我将此代码放在我的应用委托的applicationDidFinishLoading中,它可以正常工作!

NSFetchRequest *theReq = [[NSFetchRequest alloc] init];
    NSEntityDescription *theEntity = [NSEntityDescription entityForName:@"Thread" inManagedObjectContext:self.managedObjectContext];
    [theReq setEntity:theEntity];

    NSArray *theThreads = [NSArray arrayWithArray:[self.managedObjectContext executeFetchRequest:theReq error:nil]];

3 个答案:

答案 0 :(得分:1)

在快速查看代码之后,我想我发现了一些需要注意的部分。我会尝试在下面分解它们:

<强> SMSAppAppDelegate

1)请注意,在您的接口文件中,您使用变量名末尾的下划线声明CoreData变量。然后为每个ivar 创建属性,不用下划线。只要你帮助他们完成正确的任务,这一切都很好,这似乎在你的实现中缺失了:

@synthesize managedObjectContext=managedObjectContext_;
@synthesize managedObjectModel=managedObjectModel_;
@synthesize persistentStoreCoordinator=persistentStoreCoordinator_;

<强> DownloadContacts

1)在这个类中,您直接通过变量调用managedObjectContext。我不建议这样做,但这不是你的实际问题。请注意,即使您没有所有权,也可以在dealloc上释放managedObjectContext!

2)在这种情况下,我要做的是声明上下文的属性,始终通过属性访问它。此外,如果您重命名实例变量以在末尾包含下划线,那么您最大限度地减少了直接访问它的可能性(即不使用self。),这将使您更容易找到此类中您实际执行此操作的位置(记忆中有几个地方。

因此,在您的接口文件中,重命名managedObjectContext ivar并声明一个属性:

NSManagedObjectContext *managedObjectContext_;
...
@property (nonatomic, retain) NSManagedObjectContext managedObjectContext;

并且不要忘记在@sythesize上进行赋值并在dealloc上发布,因为你使用了retain属性:

@synthesize managedObjectContext=managedObjectContext_;
...
[managedObjectContext_ release];

然后,如果你尝试编译,你会得到两到三个无法识别的实例变量的错误,你需要将它改为self.managedObjectContext

<强> MessagesRootViewController

最后我建议你在MessagesRootViewController中执行相同的过程,但是这个过程应该仍然可以正常工作!

如果上述任何内容不明确,请了解您的情况并告诉我们! 干杯, ROG

答案 1 :(得分:0)

我假设你正在做类似的事情:

[ClassName persistentStoreCoordinator]

确保ClassName已定义且具有persistentStoreCoordinator类方法。也许这些东西的文件被删除了?

马特

答案 2 :(得分:0)

您的数据库可能已损坏,请尝试重置iOS模拟器 点击iOS模拟器&gt;重置内容和设置。

修改的: 看起来你正试图调用一个不存在的选择器。尝试确定删除了哪些文件,因为您似乎有一个在运行时无法找到的方法。您的核心数据类是否已被删除,可能吗?