2011-12-20 108 views
0

我試圖在設備上保存NSMutableArray,但每次我重新加載應用程序時,數據都將被刪除。無法在NSUserDefaults中保存NSMutableArray

我試圖用NSUserDefaults的,但問題仍然存在

這裏是代碼我使用

-(void) addingData{ 

    [data addObject:theBarcodeString]; //data is the NSMutableArray 

    [mainTableView reloadData]; //this is a UITableView where the data from the NSMutableArray is populated 
    [self endText]; 
    history=[NSUserDefaults standardUserDefaults]; 
    [history  setObject:data   forKey:@"history" ]; 
} 

這裏是我加載數據

- (void)viewDidLoad 
{ 
    ... 
    if (data == nil) { 
     data = [[NSMutableArray alloc] init]; //onload it always goes to his line 

    else { 

     data=[[NSUserDefaults standardUserDefaults] objectForKey:@"history" ]; 
    } 
    ... 
} 

我在做什麼錯了?

+0

你爲什麼要測試'data == nil'? – kennytm 2011-12-20 14:29:17

+0

查看數據是否已經保存在NSMutableArray中 – user1051935 2011-12-20 14:30:02

回答

3

你不應該測試數據== nil。相反,只要這樣做:

data = [[NSArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] 
    objectForKey:@"history"]]; 

請注意,您將不得不在以後發佈。

如果你想data是一個可變的數組,你必須使用:

data = [[NSUserDefaults standardUserDefaults] mutableArrayValueForKey:@"history"]; 

如果您嘗試進行變異對數據的操作,而無需使用mutableArrayValueForKey,你會得到一個崩潰,因爲所有的對象返回來自NSUserDefaults是不可變的。

+0

我試過第二個選項,它工作得很好! – user1051935 2011-12-20 14:43:18

+0

很高興知道這對你有幫助! – 2011-12-20 14:48:41

0

同步寫入持久域任何修改磁盤 和更新所有未修改的持久域,什麼是在磁盤上。

  • (BOOL)同步

返回值YES,如果數據被成功地保存到磁盤,否則 NO。

所以,你必須添加[history synchronize]迫使上的默認值寫入

編輯:從Docs

因爲這個方法是每隔一段時間自動調用, 使用此方法僅如果你不能等待自動 同步(例如,如果您的應用程序即將退出)或 如果您要更新用戶默認設置爲磁盤上的內容,即使 你沒有做任何改變。

因此,如果您想立即保存更改,請致電[history synchronize]

+0

您通常不應該自己調用同步。從文檔:'同步方法,它會定期自動調用,使內存中的緩存與用戶的默認數據庫保持同步。' – 2011-12-20 14:35:59

+0

您是否調用了同步,但它沒有奏效? – 2011-12-20 14:45:43

+0

我通常從不會同步除了在applicationWillTerminate – 2011-12-20 14:48:24

相關問題