开头
- 这是分篇章,整篇请看零基础iOS开发学习日记
存储本地信息
实际用处
- 把信息存储到本地中,下次打开自动展示
- 对于小数据有
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
进行存储
//.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