-3

我以前使用过 NSuserDefaults 和 NSkeyedArchive,但我认为它不适用于我的新项目。

我从 JSON 中取回数据并将其存储在一个数组中(姓名、年龄、国家/地区)(所有 NSString)

我想在详细视图中创建一个保存按钮,以便保存该人的数据。

并在另一个 tableview 中显示保存的数据。(在数组上循环并取回所有对象)

我应该如何以一种简单的方式处理这个..我除了最多 40 个存储的名称,所以它不是那么重..

所以简而言之,我想要一个你在“家庭应用程序”中看到的功能,你可以在其中“收藏/存储房子”

- 更新

viewDidLoad

NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [docDir stringByAppendingPathComponent:@"Names.plist"];

NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:filePath];

arrayWithNames = [[NSMutableArray alloc]init];
[arrayWithNames addObjectsFromArray:array];

保存按钮

NSMutableArray *nameInfo = [[NSMutableArray alloc]initWithObjects:self.name,self.age,self.country, nil];

[arrayWithNames addObjectsFromArray:nameInfo];



NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Names.plist"];


[arrayWithNames writeToFile:path atomically:YES];

这可行,但我将所有数据放在一起,而不是将每个数组作为独立对象

顺便说一句,我确保不能有 NULL :)

4

2 回答 2

1

正如您所说,只要所有数据都是NSString值,您就可以使用writeToFile:atomically:将数组保存到文件中。但是,JSON 有时包含与该方法不兼容的空值。如果在存在空值时尝试使用该方法,它将引发异常。如果有任何可能出现空值(而且几乎总是有机会),您需要采取一些预防措施。几种可能性:

  • 制作数据的可变副本,遍历它,并删除空值或用其他东西(如空字符串)替换它们。
  • 通过将数据转换回 JSON [NSJSONSerialization dataWithJSONObject:options:error:],然后将结果写入NSData文件。
于 2013-06-27T17:11:07.937 回答
0

我不太明白你的问题。

但是在您的情况下,我所做的是创建一个具有我打算存储的信息结构的模型(在您的情况下看起来是Person)并创建了一个数组,我将在其中添加对象Person

可以使用几种情况来保存,但在我看来,最简单的方法是通过 NSUserDefaults (解决方案在很大程度上取决于您的数据库)。

Soo,您将拥有模型Person

import <Foundation/Foundation.h> 
@interface Person : NSObject


@property(nonatomic,strong) NSString *name;
@property(nonatomic,strong) NSString *country;
@property(nonatomic,strong) NSString *age;
...

使用加密方法:

- (void)encodeWithCoder:(NSCoder *)encoder {
    //Encode properties, other class variables, etc
    [encoder encodeObject:self.name forKey:@"name"];
    [encoder encodeObject:self.age forKey:@"age"];
    [encoder encodeObject:self.country forKey:@"country"];
}

- (id)initWithCoder:(NSCoder *)decoder {
    if((self = [super init])) {
        //decode properties, other class vars
        self.name = [decoder decodeObjectForKey:@"name "];
        self.age = [decoder decodeObjectForKey:@"age"];
        self.country = [decoder decodeObjectForKey:@"country"];

    }
    return self;
}

然后你创建一个 NSMutableArray 来添加你的对象。

[arrayPeople addObject:person];

当您决定在应用程序中存储数据时,您可以这样做:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSData *myEncodedObjectShopping = [NSKeyedArchiver archivedDataWithRootObject:arrayPeople];
[defaults setObject:myEncodedObjectShopping forKey:@"people"];

要检索数据:

NSData *myDecodedObject = [defaults objectForKey:@"people"];
NSMutableArray *decodedArray =[NSKeyedUnarchiver unarchiveObjectWithData: myDecodedObject];
于 2013-06-27T17:38:04.290 回答