iOS数据的存储

iOS应用数据存储的常用方式有

1.plist文件。2 .Preference(偏好设置)。 3.NSKeyArchiver归档(NSCoding)4.数据库存储(SQLite3 当有大量的数据需要存储时使用)。


今天我们只讲前面三中,数据库后面在说。

讲之前要先了解一下沙盒(sandbox),每个软件都有自己的应用沙盒(应用沙盒就是应用的文件夹),与其它文件系统隔离。应用必须待在自己的沙盒里,

其它应用不能访问该沙盒。应用沙盒的文件系统目录如下图:

     

沙盒中各文件夹的作用

  • Documents:保存应用运行时生成的需要持久化的数据iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录。保存相对重要的数据。
  • tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。保存不重要的并且大的数据。
  • Library/Caches:保存应用运行时生成的需要持久化的数据iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据
  • Library/Preference:保存应用的所有偏好设置iOSSettings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录。该目录由系统管理, 无需我们来管理。通常用来存储一些基本的软件配置信息, 比如记住密码、自动登录等。

获取沙盒路径

NSLog(@"沙盒路径==@",NSHomeDirectory());

注意要和bundle路径区分开,别搞混淆了

NSLog(@"bundlePath======%@",[NSBundlemainBundle].bundlePath);

bundle路径应用程序的根路径,比如获取项目info.plist文件,通过bundle路径去拿。


获取documents文件夹路径

NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];

第一个参数:目标文件。第二个参数:作用域,第三个参数:是否展开~。


获取caches文件夹路径

NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)lastObject];


获取tmp文件夹路径

NSString *tempPath =NSTemporaryDirectory(); 

直接通过方法去获取。


那先讲第一种plist文件存储(主要存储有writeToFile方法的对象,比如NSArray NSDictionary NSString NSData 对象);

    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,               NSUserDomainMask,YES)lastObject];    

    NSArray *names = [NSArrayarrayWithObjects:@"Jack",@"Rose",@"Tom"];

    NSString *file = [documentPathstringByAppendingPathComponent:@"name.plist"];

    //参数2:是否允许原子型写入

    [names writeToFile:fileatomically:YES];


plist文件的读取

    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject];    

    NSString *file = [documentPathstringByAppendingPathComponent:@"name.plist"];

    NSArray *names = [NSArrayarrayWithContentsOfFile:file];


偏好设置存储(本质还是一个plist文件)

    NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];

    [defaults setBool:YESforKey:@"isAutoLogin"];

    [defaults setObject:@"wululin"forKey:@"userName"];

    [defaults setObject:@"560560"forKey:@"password"];

    [defaults synchronize];

记得要调用  synchronize.


偏好设置读取

    NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];

    BOOL  isAuto = [defaultsboolForKey:@"isAutoLogin"];

    NSString *name = [defaultsobjectForKey:@"userName"];

    NSString *password = [defaultsobjectForKey:@"password"];


归档

对象要归档,首先要遵守NSCoding协议,然后实现encodeWithCoder方法,告诉系统哪些属性需要归档。

创建一个Person类 遵守NSCoding协议。

#import <Foundation/Foundation.h>

@interface Person :NSObject<NSCoding>

@property(nonatomic,copy)NSString *name;

@property(nonatomic,copy)NSString *phone;

@end


实现encodeWithCoder方法

@implementation Person

//归档 告诉系统要存储哪些属性

-(void) encodeWithCoder:(NSCoder *)aCoder {

    [aCoder encodeObject:self.nameforKey:@"name"];

    [aCoder encodeObject:self.phoneforKey:@"phone"];   

}

@end 


NSKeyedArchiver将对象写入文件

 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectoryNSUserDomainMaskYES)lastObject];

    

    NSString *filePath = [path stringByAppendingPathComponent:@"person.plist"];

    

    [NSKeyedArchiver archiveRootObject:person toFile:filePath];


反归档

实现initWithCoder方法

//反归档读取对象的哪些属性

-(instancetype) initWithCoder:(NSCoder *)aDecoder {

    

    if(self == [superinit]) {

        self.name = [aDecoderdecodeObjectForKey:@"name"];

        self.phone = [aDecoderdecodeObjectForKey:@"phone"];

    }

    returnself;

}

NSKeyedUnarchiver将文件转化成对象

NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)lastObject];

    

    NSString *filePath = [pathstringByAppendingPathComponent:@"person.plist"];

    

    [NSKeyedArchiverarchiveRootObject:persontoFile:filePath];

    

    

    Person *p = [NSKeyedUnarchiverunarchiveObjectWithFile:filePath];











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值