2010-06-07 6 views
0

이 사람은 저를 배앓게합니다. applicationWillTerminate에서 나는 두 가지 일을하고 있습니다 : 일부 설정을 앱 설정 plist 파일에 저장하고 변경된 데이터를 managedObjectContext에서 참조 된 SQLite 데이터베이스로 업데이트합니다. 문제는 때로는 효과가 있고 다른면에서는 효과가 없습니다. 시뮬레이터와 장치에서 같은 문제가 발생합니다. 앱 실행 중에 홈 버튼을 누르면 plist 및 CoreData 스토어에 저장할 데이터 만 가져올 수 있습니다. 두 작업 또는 둘 다 작동하지 않는 것, 그리고 실행 순서 (saveState, managedObjectContext 또는 managedObjectContext, saveState)를 전환해도 아무런 차이가없는 것으로 보입니다. 어떻게 이런 일이 발생할 수 있는지 알 수 없습니다. 어떤 도움이라도 대단히 감사합니다. lqapplicationWillTerminate가 일치하지 않는 것처럼 보입니다.

AppDelegate.m 

@synthesize rootViewController; 

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

    [rootViewController saveState]; 

    NSError *error; 

    if (managedObjectContext != nil) { 

     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { 

      // Handle error 

      abort(); // Fail 
     } 
    } 

} 


RootViewController.m 

- (void)saveState { 

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

    [userDefaults setInteger:self.someInteger forKey:kSomeNumber]; 
    [userDefaults setObject:self.someArray forKey:kSomeArray]; 

} 

답변

1

불충분 한 질문에 사과드립니다. 나는 누군가가 비슷한 문제를 겪을 경우를 대비해 스스로 대답 할 것이다. 동시에 두 가지 오류가 발생하여 applicationWillTerminate가 호출되지 않은 것처럼 보입니다. 첫 xcdatamodel에서 varchar 길이 오류가 발생했습니다. 내 SQLite 행 중 일부는 xcdatamodel에서 최대로 설정 한 varchar 길이를 초과하는 문자열을 저장하려고했습니다. 이는 특정 기록에만 나타 났으므로 일치하지 않는 구원을 초래하는 것으로 보입니다. 두 번째 문제는 plist에 가능한 nil 배열 값을 잘못 저장하는 것이 었습니다. 두 오류를 모두 고치면 문제가 사라졌습니다.

그동안 나는 applicationWillTerminate보다는 관련된 값이 변경 될 때마다 plist에 저장하기로 결정했습니다. 또한 응용 프로그램이 종료되기 전에 수 백 개의 레코드가 변경 될 수 있으므로 applicationWillTerminate 대신 값이 변경 될 때마다 managedObjectContext 핵심 데이터로 저장됩니다. (이것이 나쁜 형식이 아니거나 다른 문제가 발생하기를 바랍니다.)

관련 문제