• iOS 数据持久化 NSUserDefault


    每一个应用都有一个 NSUserDefaults 实例,向 NSUserDefaults 类发送 standardUserDefaults 消息可以得到该实例。

    NSUserDefaults 实例类似与 NSMutableDictionary,可以通过键存取或删除该对象。

    当应用第一次使用 NSUserDefaults 实例时,NSUserDefaults 实例会自动从文件读取数据;修改数据后,NSUserDefaults 实例会自动将数据写入文件。

    NSUserDefaults 的键必须是字符串类型,一个键对应一个偏好设置,偏好设置的值是对象,而且是可序列化的(serializable)对象;也可以通过基本类型的数值存取偏好设置。

    NSUserDefaults 的键都是字符串,并且存放和读取某个偏好设置时需要使用同一个键。

    可以将这些字符串定义为静态变量或者“宏”,这样就可以将这些变量用做键,而不时写死的字符串,从而避免输入错误。

    偏好设置的命名命名约定: 应用名+偏好设置名+单词PrefKey

    列子一:

    //
    NSString *const projectFavnamePrefkey = @"projectFavnamePrefkey";
    NSInteger i =0;
    [[NSUserDefaults standardUserDefaults] setInteger:i forkey:projectFavnamePrefkey];
    
    //
    NSInteger j = [[NSUserDefaults standardUserDefaults] integerForKey:projectFavnamePrefkey];

    要点:

    NSUserDefaults非常好用,并不需要用户在程序中设置NSUserDefaults的全局变量,需要在哪里使NSUserDefaults的数据,那么就在哪里创建一个NSUserDefaults对象,然后进行读或者写操作。

    针对同一个关键字对应的对象或者数据,可以对它进行重写,重写之后关键字就对应新的对象或者数据,旧的对象或者数据会被自动清理。

    例子二:

    NSArray* arr = [[NSArray alloc] initWithObjects:@"111", @"222",@"22223333",nil];
    NSMutableArray* marr = [[NSMutableArray alloc] initWithArray:arr];
    NSLog(@"%i",[arr count]);
    NSLog(@"%i",[marr count]);
        
    NSUserDefaults *mydefault = [NSUserDefaults standardUserDefaults];
    [mydefault setObject:arr forKey:@"test1"];
    [mydefault setObject:marr forKey:@"test2"];
    [mydefault synchronize];  //保存到disk
        
    NSArray* getarr=[mydefault objectForKey:@"test1"];
    NSLog(@"test1=%i",[getarr count]);
    NSArray* getmarr=[mydefault objectForKey:@"test2"];
    NSLog(@"test2=%i",[getmarr count]);

    注意一点:只能存储基本对象,如果是自定义的对象,需要转换成 NSData 存储进去才可以

    iOS 本地存储数据简单的说有三种方式:数据库、NSUserDefaults和文件

    NSUserDefaults用于存储数据量小的数据,例如用户配置。并不是所有的东西都能往里放的,只支持:NSString, NSNumber, NSDate, NSArray, NSDictionary,详细方法可以查看类文件

    NSUserDefaults读取和写入自定义对象(转)

    NSUserDefaults可以存取一些短小的信息。

    比如存入再读出一个字符串到NSUserDefaults:

    但是并不是所有的东西都能往里放的。NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.

    如果把一个自定义的类存到一个NSArray里,然后再存到NSUserDefaults里也是不能成功的。

    那怎么办呢?

    方法是,让这个自定义类实现<NSCoding>协议中的- (id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder: (NSCoder *)coder方法(obj-c的协议protocol就是java的接口interface,就是C++的纯虚函数),然后把该自定义的类对象编码到 NSData中,再从NSUserDefaults中进行读取。

    粘代码:

    假设有这样一个简单的类对象

    .h

    @interface BusinessCard : NSObject <NSCoding>{  
        NSString *_firstName;  
        NSString *_lastName;  
    }  
    @property (nonatomic, retain) NSString *_firstName;  
    @property (nonatomic, retain) NSString *_lastName;  
    @end;  

    .m

    @implementation BusinessCard  
    @synthesize _firstName, _lastName;  
    - (void)dealloc{  
        [_firstName release];  
        [_lastName release];  
        [super dealloc];  
    }  
    - (id) initWithCoder: (NSCoder *)coder  
    {  
        if (self = [super init])  
        {  
            self._firstName = [coder decodeObjectForKey:@"_firstName"];  
            self._lastName = [coder decodeObjectForKey:@"_lastName"];  
        }  
        return self;  
    }  
    - (void) encodeWithCoder: (NSCoder *)coder  
    {  
        [coder encodeObject:_firstName forKey:@"_firstName"];  
        [coder encodeObject:_lastName forKey:@"_lastName"];  
          
    }  
    @end  

    调用:

    BusinessCard *bc = [[BusinessCard alloc] init];  
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];  
    NSData *udObject = [NSKeyedArchiver archivedDataWithRootObject:bc];  
    [ud setObject:udObject forKey:@"myBusinessCard"];  
    [bc release];  
    udObject = nil;  
    udObject = [ud objectForKey:@"myBusinessCard"];  
    bc = [NSKeyedUnarchiver unarchiveObjectWithData:udObject] ;   
  • 相关阅读:
    Linux下OpenSSL自签ssl证书
    戌蛤怒触铁铁树
    Python自动化办公-自动化操作Excell-openpyxl
    Python正则表达式
    Django中F查询
    如何知道自家的宽带是多少兆?
    ‘Diango中明明模版的名称写的是对的,但是访问url的时候发现没调用模版’解决方案
    Django中的聚合函数
    Django中的跨关系查询
    【RabbitMQ】零、Windows64位安装
  • 原文地址:https://www.cnblogs.com/dayw/p/3270471.html
Copyright © 2020-2023  润新知