2010-06-07 51 views
0

這一個有我batty。在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長度的字符串。這隻出現在某些記錄上,因此似乎導致保存不一致。第二個問題是錯誤地將一個可能的nil數組值保存到plist。當我解決這兩個錯誤時,問題已經消失。

與此同時,我決定每次修改相關值而不是在applicationWillTerminate時保存到plist。我每次更改值時都會保存到Core Data managedObjectContext,而不是applicationWillTerminate,因爲在終止應用程序之前可能會更改幾百條記錄。 (我希望這不是糟糕的形式或導致其他問題。)

相關問題