零基础iOS开发学习日记-功能篇-存储本地信息

开头

存储本地信息

实际用处

  • 把信息存储到本地中,下次打开自动展示
  • 对于小数据有NSUserDefaults
  • 对于大数据有NSKeyedArchiver归档
  • 整体思路,就是存数据,取数据,是基于手机本地文件数据的存取

NSUserDefaults

  • 下面是一个实例,有两个数据控件,UISwitchUITextField,对这两个控件进行数据保存和读取
  • 具体可以读取的数据,在这里就不列举了,可以自己去试一下

数据保存

- (void)save {
    NSLog(@"save");
    NSLog(@"%d", self.mySwitch.on);
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    [ud setBool:self.mySwitch.on forKey:@"isFirst"];
    [ud setValue:self.myTextField.text forKey:@"name"];
    //立即写入,必须哟
    [ud synchronize];
}
复制代码

数据删除

- (void)delete {
    NSLog(@"delete");
    self.myTextField.text = @"";
    self.mySwitch.on = NO;
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    [ud removeObjectForKey:@"isFirst"];
    [ud removeObjectForKey:@"name"];
}
复制代码

读取数据

NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
self.mySwitch.on = [ud boolForKey:@"isFirst"];
self.myTextField.text = [ud objectForKey:@"name"];
NSLog(@"%d", self.mySwitch.on);
NSLog(@"%@", self.myTextField.text);
复制代码

NSKeyedArchiver

  • 下面以个人信息为例,作为展示,需求为保存通讯录中的姓名和联系方式
  • 存储本地信息说到底是面向数据,而每次程序启动的数据是来自本地的,所以要在模型中进行编码和解码
  • 并且这个方法,需要创建data文件进行保存
  • 我接触到项目,是负责保存数据模型的,方法会比较死,如果有其他场景欢迎交流

数据模型

  • 模型中,遵守NSSecureCoding协议
  • 基本数据类型,要通过NSNumber进行存储
//.h
@interface people : NSObject <NSSecureCoding>
@property (nonatomic, assign) NSString *name;
@property (nonatomic, assign) bool isFirst;
@end
//.m
-(void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:_name forKey:@"name"];
    [coder encodeObject:[NSNumber numberWithBool:_isFirst] forKey:@"isFirst"];
}

- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder {
    self = [super init];
    if (self) {
        _name = [coder decodeObjectForKey:@"name"];
        NSNumber *isFirst = [coder decodeObjectForKey:@"isFirst"];
        _isFirst = isFirst.boolValue;
    }
    return self;
}
+ (BOOL)supportsSecureCoding {
    return YES;
}
复制代码

解档数据模型

  • 获取数据
#define kFilePath [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"people.data"]
复制代码
NSError *error;
NSLog(@"%@", kFilePath);
//涉及到的类
NSSet *set = [NSSet setWithObjects:[NSMutableArray class], [people class], nil];
self.people = [NSKeyedUnarchiver unarchivedObjectOfClasses:set fromData:[NSData dataWithContentsOfFile:kFilePath] error:&error];
if(error)
{
    NSLog(@"%@", error);
}
[self.people enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%@", obj);
}];
复制代码

保存数据

- (void)save {
    people *p = [people new];
    p.name = self.myTextField.text;
    p.isFirst = self.mySwitch.on;

    [self.people addObject:p];
    
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.people requiringSecureCoding:NO error:nil];
    [[NSFileManager defaultManager] createFileAtPath:kFilePath contents:nil attributes:nil];
    [data writeToFile:kFilePath atomically:YES];
}
复制代码

Swift实现解档存档

模型

class people: NSObject, NSSecureCoding {
    
    static var supportsSecureCoding: Bool = true
    init(n: String, i: Bool) {
        name = n
        isFirst = i
    }
    func encode(with coder: NSCoder) {
        coder.encode(name, forKey: "name")
        coder.encode(isFirst, forKey: "isFirst")
    }
    
    required init?(coder: NSCoder) {
        name = coder.decodeObject(forKey: "name") as? String
        isFirst = coder.decodeObject(forKey: "isFirst") as? Bool
    }
    
    var name: String?
    var isFirst: Bool?
    override var description: String {
        return "\(name!) - \(isFirst!)"
    }
}
复制代码

保存

@objc private func save() {
    print("save")
    p = people(n: myTextField.text!, i: mySwitch.isOn)
    print(p!)
    peopleArr!.add(p!)
    let data = try! NSKeyedArchiver.archivedData(withRootObject: peopleArr!, requiringSecureCoding: true)
    FileManager.default.createFile(atPath: peoplePath, contents: data, attributes: nil)
    
}
复制代码

获取

  • 获取模型数组
if !(FileManager.default.fileExists(atPath: peoplePath)) {
    FileManager.default.createFile(atPath: peoplePath, contents: nil, attributes: nil)
}

peopleArr = try? NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSMutableArray.classForKeyedUnarchiver(), people.classForKeyedUnarchiver()], from: Data(contentsOf: URL(fileURLWithPath: peoplePath))) as? NSMutableArray
for i in peopleArr ?? [] {
    print(i)
}
复制代码
  • 获取单个对象
p = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(Data(contentsOf: URL(fileURLWithPath: peoplePath))) as? people
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享