2013-12-17 67 views
2

我之後按鈕的操作方法讓我的自定義類對象。現在我需要在NSMutableArray中存儲多個自定義對象,然後將此數組存儲在NSUserDefaults中。如何保存自定義對象數組並將其存儲在NSUserDefaults的 - iPhone

這裏是我的代碼:

-(IBAction)onClickSubmitLater:(id)sender 
{ 
    //Saving store in user defaults for later upload data. 

    NSMutableArray *arrayStoreList = [[NSMutableArray alloc] init]; 
    arrayStoreList = [Util getArrayPreference:@"Store"];//arrayStoreList is the list of all stores. 

    Store *store = [[Store alloc] init]; 
    store = [arrayStoreList objectAtIndex:self.selectedStoreIndex];//here i am getting particular store that i need to save in array. 

    //archive 
    NSData *dataStore = [NSKeyedArchiver archivedDataWithRootObject:store]; 
    [[NSUserDefaults standardUserDefaults] setObject:dataStore forKey:@"resultStore"]; 

    //unarchive 
    NSData *dataResultStore = [[NSUserDefaults standardUserDefaults] objectForKey:@"resultStore"]; 

    Store *resultStore = (Store *)[NSKeyedUnarchiver unarchiveObjectWithData:dataResultStore]; 
    NSLog(@"%@", resultStore); 
} 

使用上面的代碼,它節省了單一的自定義類Store對象NSUserDefaults。所以,我想保存所有Store對象NSMutableArray提交後IBAction爲後。稍後,我將一個接一個地在服務器上獲取上傳商店的商店陣列。

謝謝。

+0

- (void)encodeWithCoder:(NSCoder *)encode; - (id)initWithCoder:(NSCoder *)decode;我已經在Store實體中實現。爲什麼downvote? –

+0

NSUserDefaults的用於存儲的偏好,所以問這個問題給自己「是否有必要使用NSUserDefaults的」?還有很多其他選項可以保存數據,如存儲爲plist,使用編碼器和解碼器等。有一個由nick lockwood編寫的漂亮的可重用類,請參閱https://github.com/nicklockwood/BaseModel。我建議你使用它。謝謝! – iCoder

+0

是的,根據我的要求,我必須使用userDefaults。停止從Xcode的應用程序。它仍然是同一家商店。 –

回答

1

這兩種方法將主要用於storeretrieve自定義對象的屬性。

- (void)encodeWithCoder:(NSCoder *)encoder ; 
- (id)initWithCoder:(NSCoder *)decoder; 

採取看看@ chrissr的answer,@Brad拉爾森的answer

+0

感謝mani,我在商店實體類中實現了上面的NSCoding方法。 –

+0

如果這些評論對你有幫助,請打勾或提醒訪客注意。 :) – Mani

+0

正確@mani,但我的問題是將所有Store對象保存在NSMutableArray中。使用上面的代碼,我在Userdefaults中保存了一個類對象。首先,我需要將所有存儲添加到數組中,然後將此數組存儲在userdefault中。 –

2

你需要通過實施NSCoding協議存檔。然後你可以把它寫入任何文件。

實現模型中的這些方法:

- (void) encodeWithCoder : (NSCoder *)encode ; 
- (id) initWithCoder : (NSCoder *)decode; 

正如你所說,你已經在類中實現這一點,現在你需要保存的陣列。

保存和讀取數組,你需要使用:;

[[NSUserDefaults standardUserDefaults] setObject:yourMutableArray forKey:@"keyForArray"]; 
NSMutableArray *array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"keyForArray"]]; 
+0

是的,我已經爲Store Entity類做了NSCoding。 –

+0

那麼是什麼問題? –

+0

感謝Anoop..here使用我的上述代碼,我只在Userdefaults中存儲一個商店對象「resultStore」。但我需要在這裏創建一個數組,然後將所有商店對象存儲在其中。 –

19

要存儲和檢索與用戶的默認設置自定義對象數組,你可以使用下面的方法:

-(void)writeArrayWithCustomObjToUserDefaults:(NSString *)keyName withArray:(NSMutableArray *)myArray 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myArray]; 
    [defaults setObject:data forKey:keyName]; 
    [defaults synchronize]; 
} 

-(NSArray *)readArrayWithCustomObjFromUserDefaults:(NSString*)keyName 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSData *data = [defaults objectForKey:keyName]; 
    NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
    [defaults synchronize]; 
    return myArray; 
} 

但要確保你已經實現

- (void) encodeWithCoder : (NSCoder *)encode ; 
- (id) initWithCoder : (NSCoder *)decode; 

在數據模型類的方法避免碰撞爲如下:

- (void)encodeWithCoder:(NSCoder *)coder; 
{ 
    [coder encodeObject:label forKey:@"label"]; 
    [coder encodeInteger:numberID forKey:@"numberID"]; 
} 

- (id)initWithCoder:(NSCoder *)coder; 
{ 
    self = [super init]; 
    if (self != nil) 
    { 
     label = [[coder decodeObjectForKey:@"label"] retain]; 
     numberID = [[coder decodeIntegerForKey:@"numberID"] retain]; 
    } 
    return self; 
} 
+0

感謝您的幫助,也感謝您避免崩潰。 –

+0

@ AbdullahMd.Zubair我必須在代碼中的任何地方使用'encodeWithCoder'和'initWithCoder'嗎? –

+0

你必須執行,否則將無法正常工作! –

相關問題