【问题标题】:How to save custom objects in array and store it in NSUserDefaults - iPhone如何将自定义对象保存在数组中并将其存储在 NSUserDefaults - iPhone
【发布时间】:2013-12-17 06:48:34
【问题描述】:

在按钮操作方法之后,我得到了我的自定义类对象。现在我需要在NSMutableArray中存储多个自定义对象,然后将这个数组存储在NSUserDefaults中。

这是我的代码:

-(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 中。所以我想在稍后提交ibaction后将所有Store对象保存在NSMutableArray中。稍后,我将获取商店数组以将商店一一上传到服务器上。

谢谢。

【问题讨论】:

  • - (void) encodeWithCoder : (NSCoder *)encode ; - (id) initWithCoder : (NSCoder *)decode;我已经在 Store 实体中实现了。为什么要投反对票?
  • NSUserDefaults 用于存储首选项,所以问自己这个问题“是否有必要使用 NSUserDefaults”?还有许多其他选项可以持久化数据,例如存储为 plist、使用编码器和解码器等。有一个漂亮的可重用类,由 nick lockwood 编写,请查看 github.com/nicklockwood/BaseModel。我建议你使用它。谢谢!
  • 是的,根据我的要求,我必须使用 userDefaults。从 Xcode 停止应用程序后。它将保持在同一家商店。

标签: ios objective-c arrays nsuserdefaults


【解决方案1】:

要在用户默认值上使用自定义对象存储和检索数组,您可以使用以下方法:

-(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;
}

【讨论】:

  • 感谢您帮助我,也感谢您避免崩溃。
  • @AbdullahMd.Zubair 我必须在代码中的任何地方使用encodeWithCoderinitWithCoder 吗?
  • 一定要实现,否则不行!
  • 但是你没有在任何地方使用!其实我没有得到这个
  • 你必须为你的模型实现它
【解决方案2】:

您需要通过实现NSCoding 协议来归档它。然后你可以将它写入任何文件。

在您的模型中实现这些方法:

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

正如你所说,你已经在 Class 中实现了这个,现在你需要保存数组。

要保存和读取数组,需要使用:;

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

【讨论】:

  • 那是什么问题?
  • 感谢 Anoop..这里使用我上面的代码我只在 Userdefaults 中存储一个存储对象“resultStore”。但我需要在这里创建一个数组,然后将所有存储对象存储在其中。
  • 所以你的问题是处理数组?检查我编辑的答案
  • 它显示 [NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '("" )' of class '__NSArrayM' in console.
【解决方案3】:

这两个方法主要用于storeretrieve自定义对象的属性。

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

看看@chrissr 的answer,@Brad Larson 的answer

【讨论】:

  • 感谢 mani,我已经在 store 实体类中实现了上面的 NSCoding 方法。
  • 如果这些 cmets 对您有帮助,请点赞或点赞以引起访客的注意。 :)
  • 正确的@mani,但我的问题是将所有 Store 对象保存在 NSMutableArray 中。使用上面的代码,我将一个类对象保存在 Userdefaults 中。像这样首先我需要将所有存储添加到一个数组中,然后将此数组存储在 userdefault 中。
  • 你看到我添加链接的@Brad Larson 的回答了吗?
  • 哥们,你说你用他的代码实现了上面的方法,而不是你必须尊重并放弃投票。+1
猜你喜欢
  • 2011-01-19
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
相关资源
最近更新 更多