• iOS笔记———数据存储


    应用沙盒:应用文件系统的根目录,每个应用都有独自的沙盒相互;在xcode中可以用NSHomeDirectory()函数,打印当前应用的沙盒根路径。

    应用程序包:包含了所有资源文件和执行文件;

      * Documents:保存应用运行时生成的需要持久化的数据,iTunes同步会备份该目录。

      * tmp:保存应用运行时生成的临时数据,使用完毕后再将相应的文件从该目录从删除,应用没有运行时系统也会自动清楚该目录,iTunes同步时不会被备份该目录。

      * Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步时不会备份该目录,一般储存比较大的数据、不用备份的数据。

      * Library/Preference:保存应用的所有偏好设置,iOS的setting(设置)应用会在这在该目录中查找应用的设置信息。iTunes同步时,会备份该目录。

    获取Documents目录的两种方式:

      1,NSHomeDirectory()获取应用的根目录,然后用NSString类的对象方法stringByAppendingPathComponent:拼接Documents.

    //获取到应用根目录
    
    NSString *home = NSHomeDirectory();
    NSString *path =[home stringByAppendingPathComponent:@"Documents"];
    

       2,NSSearchPathForDirectoriesInDomains()函数

    //NSUserDomainMask 代表从用户文件夹下找
    //NO 代表不展开路径下的波浪字符“~”
    
    NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,NO);
    
    //在iOS中,只有一个目录跟传入的参数匹配,所以这个集合里面只有一个元素
    NSString *document = [arr objectAtIndex:0];
    

    获取tmp路径:NSString *tmp = NSTemporaryDirectory();

    获取Library/Caches路径:NSString *caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,NO);

    获取Library/Preference:通过NSUserDefaults类获取信息。

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

      * XML属性列表(plist)归档;

      * preference(偏好设置);

      * NSKeyedArchiver归档(NSCoding);

      * SQLite3

      * Core Data;

    XML属性列表

      是一种xml格式的文件,拓展名为plist.若对象是NSStringNSDictionaryNSArrayNSDataNSNumber等类型,

      都可以调用writeToFile:aomically:方法将对象写到plist文件中。 

     

    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setObject:@"jack" forKey:@"name"];
    [dict setObject:@"1223244" forKey:@"phone"];
    
    //filePath 可以documens路径或者沙盒里其他路径;
    [dict writeToFile:filePath atomically:YES];
    
    //读取plist文件;
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];

    Preference(偏好设置):很多iOS应用都支持偏好设置,比如保存用户名、密码、字体大小等设置。每个应用都有一个NSUserDefaults实例,通过这个实例来存取偏好设置。

    //存储偏好设置内容
    
    NSUserDefaults *defaluts = [NSUserDefaults standardUserDefaults];
    
    [defaults setobject:@"jack" forKey:@"UserName"];
    [defaults setFloat:190.1f forKey:@"height"];
    [defaults setBool:YES forKey:@"autoLogin"];
    
    //取得偏好设置内容
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *userName = [defaults stringForKey:@"userName"];
    float height = [defaults floatForKey:@"height"];
    BOOL autoLogin = [defaults boolForKey:@"autoLogin"];
    
    

     * 注意:NSUserDefaults 设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘,所以调用了set方法之后数据可能还没写入磁盘应用程序就终止。

      出现以上问题可以调用synchronize方法强制写入。

    [defaults synchronize];
    

     NSKeyedArchiver归档(NSCoding)

      * 如果对象是NSString、NSDictionary、NSData、NSArray、NSNumber等,可以直接用NSKeyedArchiver进行归档和恢复。

      * 其他对象需要遵循NSCoding协议。

      * NSCoding协议的两个方法:

        · encodeWithCode:每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以用encodeObject:forKey:encodeInt:forKey:等方法进行归档。

        · initWithCoder:每次从文件中恢复(解码)时,都会调用这个方法。这个方法指定如何解码文件中的数据转为对象的实例变量。可以用使用decodeObject:forKeydecodeInt:forKey:等方法解码实例变量。

    //创建Person对象 遵守 NSCoding 协议
    Person.h 
    
    @interface Person : NSObject
    
    @property(copy,nonatomic) NSString *name;
    
    @property(assign,nonatomic) int age;
    
    @end
    
     Person.m
    
    #import "Person.h"
    
     
    
    @implementation Person
    
     
    
     
    
    - (void)encodeWithCoder:(NSCoder *)aCoder{
    
        
    
        [aCoder encodeObject:self.name forKey:@"name"];
    
        [aCoder encodeInt:self.age forKey:@"age"];
    
    }
    
     
    
    - (id)initWithCoder:(NSCoder *)aDecoder{
    
        
    
        if (self = [super init]) {
    
            self.name = [aDecoder decodeObjectForKey:@"name"];
    
            self.age = [aDecoder decodeIntForKey:@"age"];
    
        }
    
        return self;
    
    }
    
    @end
    
    //获取归档路径文件filePath
    
    Person *p = [[Peron alloc] init];
    
    p.name = @"jack";
    
    p.age = 10;
    
     
    
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectiory,NSUserDomainMask,YES) lastObject];
    
    NSString *filePath = [doc stringByAppendingPathComponent:@"person.data"];
    
    //对象归档
    
    [NSKeyedArchiver archiveRootObject:p toFile:filePath];
    
    //从filePath中读取对象
    
    Person *p1 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    
    	
    
    
    

     ***注意 :如果对象的父类也遵守了NSCoding的协议,

      在实现encodeWithCoder:方法中应该调用 [super encodeWithCoder:aCoder]; 

      实现initWithCoder:方法中 应该调用 self = [super initWithCoder:aCoder];

    确保继续的成员变量能被归档和解档。

    NSData

      * 使用archiveRootObject:toFile:方法可以将一个对象直接写入一个文件中,但多时候需将多个对象同时写入到一个文件中,那么就用到NSData来归档。

      * NSData可以为一些数据提供临时的存储空间,以便随后写入文件;或者存放从磁盘读取文件的内容。可以使用[NSMutableData data]创建可变数据空间;

      

      

      归档(编码)

    //新建一块可变数据区
     NSMutableData *data = [NSMutableData data];
    //将数据连接一个NSKeyedArchiver对象
     NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWrittingWithMutableData:data];
    //开始存档对象,存储的数据会存档到data中
    [archiver encodeObject:person1 forKey:@"person1"];
    [archiver encodeObject:person2 forKey:@"person2"];
    //存档完毕。一定要调用finishEnCoding方法
    [archiver finishEncoding];
    //将存档的数据,写到文件中
    [data writeToFile:filePath atomically:YES];
    

       解档(解码)

    //从文件中获取数据
    NSData *data [NSData dataWithContentsOfFile:filePath];
    //根据获取到的数据,解析成一个NSKeyedUnarchiver对象
    NSKeyUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    Person *p1 = [unarchiver decodeObjectForKey:@"person1"];
    Person *p2 = [unarchiver decodeObjectForKey:@"person2"];
    //恢复完毕
    [unarchiver finishDeCoding];

    ***利用归档实现深复制

    //临时存储一个person1对象
    NSData *data = [NSKeyedArchiver archiveDataWithRootObject:person1];
    Person *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
  • 相关阅读:
    安装Hadoop
    爬虫综合大作业
    理解爬虫原理
    中文词频统计与词云生成
    复合数据类型,英文词频统计
    字符串操作、文件操作,英文词频统计预处理
    了解大数据的特点、来源与数据呈现方式
    结对项目-四则运算 “软件”之升级版
    分布式版本控制系统Git的安装与使用
    Maven 依赖的scope标签用法
  • 原文地址:https://www.cnblogs.com/xiezero/p/4536918.html
Copyright © 2020-2023  润新知