iOS本地数据存储有哪几种方式?

1.  复杂对象写入本地NSKeyedArchiver(归档)采用归档的形式来保存数据,该对象数据需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。

现在创建一个Boss类,并且.h遵守NSCoding协议,.m两个协议方法。


Boss.h文件
#import <Foundation/Foundation.h>
// NSCoding 协议 把一个类中的所有数据, 进行整体编码 方便进行文件读取
@interface Boss :  NSObject <NSCoding>
@property (nonatomic, retain)NSString
 (nonatomic, retain)NSString *sex;
 (nonatomic, retain)NSString *number;
 
 @end
 
 
 
 
 
 
 
Boss.m文件 
 
 
"Boss.h"
@implementation
- (void)dealloc
{
    [_name  release];
    [_sex release];
    [_number  release];
super dealloc];
}
 
 
// 协议方法1  
- (void)encodeWithCoder:(NSCoder
{
    // 对每个属性标记, 用于在读取数据时进行恢复
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.sex forKey:@"sex"];
    [aCoder encodeObject:self.number forKey:@"number"];
}
// 协议方法2  
- (id)initWithCoder:(NSCoder
{
self = [super init];
if (self) {
        // 每次都按照之前给定的key 给对应属性赋值
self.name = [aDecoder decodeObjectForKey:@"name"];
self.sex = [aDecoder decodeObjectForKey:@"sex"];
self.number = [aDecoder decodeObjectForKey:@"number"];
    }
    return  self;
}
@end


2.Write写入方式:永久保存在磁盘中

//沙盒的含义  在一定范围内可以做任何事情;
//iOS的沙盒指的就是应用程序的文件操作文件夹,在文件夹内可以读写任何内容,但是完全不能访问其他应用程序的沙盒文件夹;
//Document:用户相关的文件,用户数据,用户设置的对应用程序的偏好设置,用户的一些文本信息,最好不要存储占空间较大的文件比如视频音频

// Library : 给开发者使用的
// Caches :存储缓存文件, 用户看过的图片音频视频缓存 一般的app清除缓存就是清除这个文件夹中的内容
//preferen : 给开发者存储一些内容, NSUserDefaults 保存的信息都在这个文件中
    
// tmp : 临时文件夹, 存储网络请求过程中的临时文件. 在app版本更新时会直接清空tmp文件
 //简单对象写入本地 NSString,NSArray  NSNumber  NSData  NSDictionary等; 
//打印沙盒文件路径
NSLog(@"%@", NSHomeDirectory());
    // 1.  拼接一个存储路径
            // 系统提供了一个函数 直接返回某一个沙盒文件夹的路径
                // 返回值: 找到的路径组成的数组, 如果搜索的是系统的沙盒文件 那么数组中只有一个元素
                //  参数1:  搜索沙盒中的哪个文件夹
                //  参数2:  在什么范围内搜索
                //  参数3:  返回的是相对路径 or  绝对路径
    NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// 获取文件路径
                //  取出Document文件夹的路径
NSString *docPath = [arr  lastObject];
                //  在Document文件路径后  拼接一个文件路径
    NSString *textPath = [docPath stringByAppendingString:@"/123.text"];
     
        // 2.  按照路径写入
     
    NSString *str = @"张强去WC,  把网断了, 这是个秘密";
            //  系统提供了存储字符串的方法
// 返回值: BOOL
// 参数1:  要写入的路径
                //  参数2:  是否对写入的文件进行写保护
// 参数3:  编码方式
// 参数4:  错误信息
NSError *error =  nil;
    [str writeToFile:textPath atomically:YES encoding:NSUTF8StringEncoding error:&error];
     
     
    //  读取信息
    NSString *readStr = [[NSString alloc] initWithContentsOfFile:textPath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@", readStr);
     
     
     
    //  数组写入本地
    NSArray *array = [NSArray arrayWithObjects:@"111", @"222",  @"333", @"444", nil];
    //  拼接路径
    NSString *arrPath = [docPath stringByAppendingPathComponent:@"arr.plist"];
    //  写入本地
writeToFile:arrPath  atomically:YES];
    NSArray *myArr = [[NSArray alloc] initWithContentsOfFile:arrPath];
for (NSString *str in
NSLog(@"---------%@", str);
     }

3.NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。



4.SQlite(FMDB、CoreData)NSCoding + NSKeyedArchiver实现复杂对象存储