iOS本地存储的方式
1.NSUserDefaunts (Preference偏好设置)
2.plist存储
3.归档
4.SQLite3
5.CoreData**
应用沙盒
Document :适合存储重要的数据,iTunes同步应用时会同步该文件下的内容。(比如游戏中的存档)。
Library/Caches:适合存储体积大,不需要备份的非重要数据,iTunes不会同步该文件。
tmp:保存应用的临时文件,用完就删除,系统可能在应用没在运行时删除该目录下的文件,iTunes不会同步。
获取沙盒路径
Document:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentFilePath = paths.fistObject;
1.NSuserDefault
NSuserDefault 适合存储轻量级的本地数据,支持的数据类型:NSNumber,NSString,NSDate,NSArray,NSDictionary,BOOL,NSData
沙盒路径为Library/Preferences
文件格式为.plist
优点:
1.不需要关心文件名;
2.快速进行键值对存储;
3.直接存储基本数据类型;
缺点:
1.不能存储自定义数据
2.取出的数据是不可变的
- (void)userDefaultSave{
NSArray *testArray = @[@"test1",@"test1",@"test3"];
[ [NSUserDefaults standardUserDefaults] setObject:testArray forKey:@"arraykey"];
[[NSUserDefaults standarUserDefaults] synchronize];
}
- (void)userDefaultLoad{
NSArray *testArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"arrayKey"];
NSLog(@"%@",testArray);
}
封装调用
#pragma mark 保存本地数据
void saveUserInfo(NSString *keyName,id valueName)
{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
[def setObject:valueName forKey:keyName];
[def synchronize];
}
#pragma mark 获取本地数据
NSString * getUserInfo(NSString *keyName)
{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
return [def objectForKey:keyName];
}
#pragma mark 删除本地数据
void removeUserInfo(NSString *key)
{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
[def removeObjectForKey:key];
[def synchronize];
}
2.plist存储
plist支持的数据类型:NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData,NSMutableData,NSString,NSMutableString,NsNumber,NSDate;
不支持BOOL,而且最外层好像要用NSArray或NSDictionary;
- (void)plistSave{
NSSring *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirecttory,NSUserDomainMask,YES).firstObject;
NSString *filePath = [cachPath stringByAppendingPathComponent:"testPlist.plist"];
NSMutableDitionary *dict = [NSMutableDictionary dictionary];
dict setObject:@"jack" forKey:@"name";
dict setObject:@"18" forKey:@"age";
[dict writeToFile:filepath atomically:YES];
}
- (void)plistLoad{
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
NSString *filePath = [cachePath stringByAppendingPathComponent:@"testPlist.plist"];
NSDictionary *t = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSLog(@"%@",t);
}
3.归档
存储自定义对象
1.首先新建Person类,并遵守NSCoding协议
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Person : NSObject<NSCoding>
@property (nonatomic,strong) NSString *name;
@property (nonatomic,strong) NSString *age;
@end
NS_ASSUME_NONNULL_END
2.实现协议方法
#import "Person.h"
@implementation Person
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super init];
if (self) {
_name = [coder decodeObjectForKey:@"name"];
_age = [coder decodeObjectForKey:@"age"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:self.name forKey:@"name"];
[coder encodeObject:self.age forKey:@"age"];
}
@end
3.归档解档
#pragma mark - 一个对象归档
- (void)archive{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentFilePath = paths.firstObject;
NSString *filePath = [documentFilePath stringByAppendingPathComponent:@"personModel"];
Person *p1 = [[Person alloc]init];
p1.name = @"jack";
p1.age = @"18";
[NSKeyedArchiver archiveRootObject:p1 toFile:filePath];
}
#pragma mark - 一个对象解档
- (void)unarchive{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentFilePath = paths.firstObject;
NSString *filePath = [documentFilePath stringByAppendingPathComponent:@"personModel"];
Person *p1 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@",p1.name);
NSLog(@"%@",p1.age);
}
#pragma mark - 多个对象归档
- (void)archiveManyObject
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask