开头
存储本地信息
实际用处
- 把信息存储到本地中,下次打开自动展示
- 对于小数据有
NSUserDefaults
- 对于大数据有
NSKeyedArchiver归档
- 整体思路,就是存数据,取数据,是基于手机本地文件数据的存取
NSUserDefaults
- 下面是一个实例,有两个数据控件,
UISwitch和UITextField,对这两个控件进行数据保存和读取
- 具体可以读取的数据,在这里就不列举了,可以自己去试一下
数据保存
- (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进行存储
@interface people : NSObject <NSSecureCoding>
@property (nonatomic, assign) NSString *name;
@property (nonatomic, assign) bool isFirst;
@end
-(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