2012-04-15 9 views
0

CLLocation Managerを使用して、lat、lng、timestampを移動してコアデータに格納し、テーブルビューのタブに表示するときに、いつでも誰かの場所を取得しようとしています。しかし、コンソールの出力は常にここで私はFirstViewController.Mコードは、あるmanagedObjectContextはこのログにcoredataproject[12478:11903] After managedObjectContext: <NSManagedObjectContext: 0x7248230>なぜ私のmanagedObjectContextがnillに戻るのですか?

を投げることによってnillであるここで、関連するコードは私のAppDelgate実装ファイルに

#import "AppDelegate.h" 
#import "RootViewController.h" 
#import "FirstViewController.h" 



@implementation AppDelegate 

@synthesize window; 
@synthesize navigationController; 


#pragma mark - 
#pragma mark Application lifecycle 

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

    // Configure and show the window. 

    RootViewController *rootViewController = [[RootViewController alloc] initWithStyle:UITableViewStylePlain]; 

    NSManagedObjectContext *context = [self managedObjectContext]; 
    if (!context) { 
     NSLog(@"Could not create context for self"); 
    } 
    rootViewController.managedObjectContext = context; 

    UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController]; 
    self.navigationController = aNavigationController; 

    [window addSubview:[navigationController view]]; 
    [window makeKeyAndVisible]; 


} 

/** 
applicationWillTerminate: saves changes in the application's managed object context before the application terminates. 
*/ 
- (void)applicationWillTerminate:(UIApplication *)application { 

    NSError *error; 
    if (managedObjectContext != nil) { 
     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { 
      // Handle the error. 
     } 
    } 
} 

だことを示していますついに実体

- (void)viewDidLoad 
{ 


    locationManager =[[CLLocationManager alloc] init]; 

    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    [locationManager startUpdatingLocation]; 


-(void) locationmanager: (CLLocationManager *) manager 
     didUpdateToLocation: (CLLocation *) newLocation 
     fromLocation: (CLLocation *) oldLocation 
{ 


    CLLocation *location = [locationManager location]; 
    if (!location) { 
     return; 
    } 

    /* 
    Create a new instance of the Event entity. 
    */ 
    RootViewController *rootviewcontroller = [RootViewController alloc];  
    Event *event = (Event *)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:rootviewcontroller.managedObjectContext]; 

    // Configure the new event with information from the location. 
    CLLocationCoordinate2D coordinate = [location coordinate]; 
    [event setLatitude:[NSNumber numberWithDouble:coordinate.latitude]]; 
    [event setLongitude:[NSNumber numberWithDouble:coordinate.longitude]]; 



    // Should be the location's timestamp, but this will be constant for simulator. 
    // [event setCreationDate:[location timestamp]]; 
    [event setTimeStamp:[NSDate date]]; 

    // Commit the change. 
    NSError *error; 

    if (![rootviewcontroller.managedObjectContext save:&error]) { 
     NSLog(@"Save Error"); 
    } 

    //RootViewController *rootviewcontroller = [RootViewController alloc]; 
    [rootviewcontroller.eventsArray insertObject:event atIndex:0]; 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
    [rootviewcontroller.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    [rootviewcontroller.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

} 

と場所を取得し、コアデータ「イベント」に格納することは、私が取得し、コアデータに何があるかを表示しようとしているRootViewControllerファイルです。私はこのタブをクリックしたときには、コンソールがmanagedObjectConsoleが

- (void)viewDidLoad { 

[super viewDidLoad]; 

if (managedObjectContext == nil) 
{ 
    managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    NSLog(@"After managedObjectContext: %@", managedObjectContext); 
}  
// Set the title. 
self.title = @"Locations"; 

/* 
Fetch existing events. 
Create a fetch request; find the Event entity and assign it to the request; add a sort descriptor; then execute the fetch. 
*/ 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext]; 
[request setEntity:entity]; 

// Order the events by time stamp, most recent first. 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 


// Execute the fetch -- create a mutable copy of the result. 
NSError *error = nil; 
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
if (mutableFetchResults == nil) { 
    NSLog(@"Mutable Fetch Results equals nill"); 
} 

// Set self's events array to the mutable array, then clean up. 
[self setEventsArray:mutableFetchResults]; 

}

nillであることを私に告げる私もそれがあります一度、テーブルのデータを整理していくつかのより多くのものをやっているが、私は考えていないということですそれが問題の場所です。

locationManagerからのロケーションデータを持つ必要があるため、managedObjectContextに何もない理由がわかりません。私はコアデータにあまり慣れていないので、おそらく何か簡単なことは間違っていますが、どんな洞察も高く評価されます!

+0

なぜ場所が更新されるたびに新しいRootViewControllerを作成しますか? – Felix

+0

これはテストのためのものです。私はそれが実際に働き始めるときに20メートルのような何かの距離フィルターにそれを変更します。 – michael03m

+0

そして私は新しいRootViewControllerを必要としません。CoreData経由でRootViewControllerに新しい場所を送信するだけです。 – michael03m

答えて

1

あなたの間違いはdidUpdateToLocationメソッドにあります。そこで、RootViewControllerの新しいインスタンスを作成します。 newLocationをCoreDataに保存し、そのためのMOCが必要です(RootViewControllerではなく)。したがって、MOCをFirstViewControllerに渡す方法を見つける必要があります。

managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 

なぜあなたはのviewDidLoadでRootViewControllerのMOCをリセットします:あなたはAppDelegateにまたはこのようやったように、この同様の操作を行うことができますか?あなたはすでにapplicationDidFinishLaunchingでそれを渡しました!

テーブルビューにNSFetchedResultsControllerを使用することをおすすめします。それは自動的にデータの変更を検出し、必要に応じてテーブルをリロードし、デリゲートを正しく実装するだけです。 http://www.raywenderlich.com/999/core-data-tutorial-how-to-use-nsfetchedresultscontroller

+0

ありがとう!これは私を正しい軌道に乗せるでしょう。 – michael03m

関連する問題