iOS端存储方案
ios数据持久化有几种方式
1.plist
2.NSUserDatefaults(偏好设置)
3.NSKeyedArchiver解归档
4.fmdb(Sqlite的封装)

5.CoreData
6.keyChain(钥匙串,与沙盒无关)
7.文件存储
沙盒
要想在本地存储数据,那就要知道一下什么是应用沙盒 ,其实很好理解应用沙盒就是应用的文件夹,与其他文件系统隔离。每一个iOS应用都有自己的应用沙盒,应用必须待在自己的沙盒里,其它应用不能访问该沙盒。
沙盒目录有以下几个子目录
Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录
tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录
Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据(sdwimage等第三方库的缓存都在这里面)
Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录

获取他们的路径 
 Decumnets目录 
 沙盒根目录:NSString *home = NSHomeDirectory(); 
 第一种(不建议使用) 
 NSString *documents = [home stringByAppendingPathComponent:@”Documents”]; 
 第二种 
 NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
 NSString *documents = [array objectAtIndex:0]; 
 第三种 
 [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]tmp目录 
 NSString *tmp = NSTemporaryDirectory();Library/Caches 
 第一种 
 NSString *documents = [home stringByAppendingPathComponent:@“Caches”]; 
 第二种 
 NSString *a =NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES).firstObject;Library/Preference 
 通过NSUserDefaults类存取该目录下的设置信息—————————— 
 plist 
 -(void)plist{ 
 //获取沙盒目录路径 
 NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;NSString *fileName = [path stringByAppendingPathComponent:@"123.plist"];
NSLog(@"%@",fileName);//存储字典 
 NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
 [dict setObject:@”母鸡” forKey:@”name”]; 
 [dict setObject:@”15013141314” forKey:@”phone”]; 
 [dict setObject:@”27” forKey:@”age”]; 
 //最后一个参数是否//atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写YES。 
 //存 
 [dict writeToFile:fileName atomically:YES];// //存数组 
 // NSArray *ar = @[@”1”,@”2”,@”3”,@”4”]; 
 // [ar writeToFile:fileName atomically:YES];//读取
NSMutableDictionary *Getdic = [NSMutableDictionary dictionaryWithContentsOfFile:fileName];
NSLog(@"%@",Getdic);// //读取 
 // NSArray *ar1 = [NSArray arrayWithContentsOfFile:fileName]; 
 // NSLog(@”%@”,ar1);}
备注:xml只能存储NSArray NSMutableArray NSDictionary NSMutableDictionary NSData NSMutableData NSString NSMutableString NSNumber NSDate
——————— 
 NSUserDefaults 
 —————— 
 -(void)UserDefaults{ 
 //存 
 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
 [userDefaults setObject:@”黄渤” forKey:@”影帝”]; 
 [userDefaults setBool:YES forKey:@”男的女的”]; 
 [userDefaults setInteger:40 forKey:@”age”]; 
 //立即同步 
 [userDefaults synchronize];//取
NSString *name = [userDefaults objectForKey:@"影帝"];
BOOL sex = [userDefaults boolForKey:@"男的女的"];
NSInteger age = [userDefaults integerForKey:@"age"];
NSLog(@"%@,%d,%ld",name,sex,age);}
NSKeyedArchiver(解归档) 
 归档 
 -(void)KeyedArchiver{NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"huangbo.data"];
UserModel *userModel = [[UserModel alloc]init];
userModel.name = @"黄渤";
userModel.age = 40;

[NSKeyedArchiver archiveRootObject:userModel toFile:file];} 
 解档 
 //解档 
 -(void)KeyedUnarchiver{ 
 NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@”huangbo.data”]; 
 UserModel *usermodel = [NSKeyedUnarchiver unarchiveObjectWithFile:file]; 
 if (usermodel) { 
 NSLog(@”%@,%ld”,usermodel.name,usermodel.age);}} 
 UserModel类 
 遵守 
 .m文件 
 //解档 
 -(instancetype)initWithCoder:(NSCoder *)aDecoder{if ([super init]) {
    self.name = [aDecoder decodeObjectForKey:@"name"];
    self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;} 
 //归档 
 -(void)encodeWithCoder:(NSCoder *)aCoder{[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];} 
 注:如果解归档对象有N多个属性我们可以用Returntiem来实现SQlite—FMDB 
 -(void)Fmdb{YDJlManager *mange = [YDJlManager ydjlManager];
Student *stu = [[Student alloc]init];
stu.studid = @"005";
stu.name = @"胡歌1";
stu.age = @"20";
stu.sex = @"男";
//存
[mange addModel:stu];
//取
NSArray *ar = [mange allModels];
for (Student *s in ar) {
    NSLog(@"%@",s.name);
}//查 
 BOOL isuid = [mange isExists:@”003”]; 
 NSLog(@”%d”,isuid); 
 } 
 YDJIManager类import 
import “Student.h”
@interface YDJlManager : NSObject
+(id)ydjlManager;
//增 
 -(void)addModel:(Student *)student; 
 //删 
 -(void)deleteModel:(Student *)student; 
 //获取全部 
 -(NSMutableArray *)allModels; 
 //查 
 -(BOOL)isExists:(id)model; 
 .m文件 
 import “YDJlManager.h”import “FMDatabase.h”
@implementation YDJlManager 
 { 
 FMDatabase *_fmdb; 
 NSString *path;} 
 +(id)ydjlManager 
 { 
 static YDJlManager *_m = nil; 
 if (!_m) { 
 _m = [[YDJlManager alloc]init]; 
 } 
 return _m; 
 }• (instancetype)init 
 { 
 self = [super init]; 
 if (self) {//path:指数据库文件的位置
path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]stringByAppendingPathComponent:@"ceshi.db"];// NSLog(@”path%@”,path); 
 _fmdb = [[FMDatabase alloc]initWithPath:path];//打开数据库
//如果这个数据库不存在,则先创建,再打开
//如果已经存在,直接打开供后面使用
BOOL success = [_fmdb open];
if (success) {
    //如果打开成功,创建数据库表
    NSString *sql = @"create table if not exists app(studid varchar(32),name varchar(128),age varchar(256),sex varchar(256))";
    if(![_fmdb executeUpdate:sql])
    {// NSLog(@”创建数据失败”); 
 } 
 } 
 } 
 return self; 
 }//添加收藏 
 -(void)addModel:(Student *)student 
 { 
 // NSString *sql = [NSString stringWithFormat: @”insert into app (applicationid,name,iconurl) values (‘%@’,’%@’,’%@’)”,model.applicationId,model.name,model.iconUrl]; 
 // NSLog(@”%@”,sql); 
 BOOL iscunzai = [self isExists:student.studid]; 
 if (iscunzai==1) { 
 NSLog(@”已存在不添加”); 
 }else{ 
 NSString *sql = @”insert into app (studid,name,age,sex) values (?,?,?,?)”;BOOL success = [_fmdb executeUpdate:sql,student.studid,student.name,student.age,student.sex];
if (success) {NSLog(@”添加成功”); 
 }}} 
 //删 
 -(void)deleteModel:(Student *)student 
 { 
 NSString *sql = @”delete from app where studid=?”; 
 [_fmdb executeUpdate:sql,student.studid]; 
 } 
 //改 
 -(void)updateNewName:(NSString )newName andOldName:(NSString )oldName{ 
 NSString *sql = @”update t_student set name = ? where name = ?”;BOOL result = [_fmdb executeUpdate:sql,newName,oldName];
if (result) {
    NSLog(@"修改成功");
}else{

    NSLog(@"修改失败");
}}
//所有数据 
 -(NSMutableArray *)allModels 
 { 
 NSMutableArray *resArr = [[NSMutableArray alloc]init];NSString *sql = @"select * from app";
FMResultSet *result = [_fmdb executeQuery:sql];
while ([result next]) {
    NSString *stid = [result stringForColumn:@"studid"];
    NSString *name = [result stringForColumn:@"name"];
    NSString *age = [result stringForColumn:@"age"];
    NSString *sex = [result stringForColumn:@"sex"];
    Student *stuModel = [[Student alloc]init];
    stuModel.studid = stid;
    stuModel.name = name;
    stuModel.age = age;
    stuModel.sex = sex;
    [resArr addObject:stuModel];
}

return resArr;} 
 //查 
 -(BOOL)isExists:(id)model 
 { 
 NSString *stuid; 
 if ([model isKindOfClass:[Student class]]) { 
 stuid = [(Student *)model studid]; 
 } 
 else 
 { 
 stuid = model; 
 } 
 NSString sql = @”select  from app where studid=?”; 
 FMResultSet *result = [_fmdb executeQuery:sql,stuid]; 
 return [result next]; 
 }@end