2013-12-17 2 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 *) кодирует; - (id) initWithCoder: (NSCoder *) декодирует; я реализовал в магазине. Почему downvote? –

+0

NSUserDefaults используются для сохранения предпочтений, поэтому задайте этот вопрос себе: «Нужно ли использовать NSUserDefaults»? Есть много других возможностей для сохранения данных, таких как сохранение в виде plist, использование кодера и декодера и т. Д. Существует красивый многоразовый класс, написанный nick lockwood. Посмотрите на https://github.com/nicklockwood/BaseModel. Я предлагаю вам использовать его. Благодаря! – iCoder

+0

Да, согласно моему требованию, я должен использовать userDefaults. После остановки приложения из Xcode. он останется тем же магазином. –

ответ

1

Эти два метода будут в основном использоваться для store и retrieve объектов пользовательского объекта.

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

Прими взгляд на @ chrissr-х answer, Ларсон @ Брэд 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

Да, я сделал NSCoding для класса Store Entity. –

+0

то в чем проблема? –

+0

Спасибо Anoop..используя мой код выше, я сохраняю только один объект-хранилище «resultStore» в Userdefaults. Но мне нужно создать массив здесь, а затем сохранить в нем все объекты хранилища. –

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

вам необходимо реализовать, иначе это не сработает! –

Смежные вопросы