博客> iOS 开发常用的数据读写
iOS 开发常用的数据读写
2018-10-20 15:18 评论:0 阅读:1374 DengXiaoBai
ios 数据读写

开发中常用的数据读写方法有三种: 1.直接调用wirteToFile: atomically: 写入; 2,利用NSKeyedArchiver, NSKeyedUnarchiver读写; 3利用NSUserDefaults读写.

对于这三者来说, path都要写到文件级别,不能只写到某个文件夹,还要写出文件的名称和后缀

/wirteToFile: atomically:/:

     ---NSString,NSArray,NSDictionary 等可以直接调用该方法来写入文件,一般是 .plist 文件, NSString 一般写入. txt 文件(如果页写入 .plist文件,可能会打不开该文件).

     ---写入过程(/*覆盖*/):会把原来的同名文件清除,然后从新写入.The atomically parameter is set to YES, meaning that you want the write operation to be done to a temporary backup file first; once successful, the final data is to be moved to the specified file named glossary. This is a safeguard that protects the file from becoming corrupt if, for example, the system crashes in the middle of the write operation. In that case, the original glossary file (if it previously existed) isn’t harmed.

     ---数据读出:写入时候用了什么对象,读出的时候也要用什么对象读出

/NSKeyedArchiver/NSKeyedUnarchiver/

    ---只有遵守了<NSCoding>协议并实现了协议方法,才能用此方法来读写数据

    ---写入过程(/*覆盖*/) [NSKeyedArchiver archiveRootObjectToFile: ],此方法会自动调用对象的<NSCoding>协议方法encoderWithCoder方法./*写入时会覆盖原来的同名文件*/

    ---同时写入多个对象:
            - 多个对象必须遵守<NSCoding>协议,并实现协议方法
            - 用 NSMutableData创建一个NSKeyedArchiver对象   [NSMutableData data]>>[[NSKeyedArchiver alloc]initForWritingWithMutableData:]
            - 调用NSKeyedArchiver 的[encoderObject:forKey:],把对象写到NSMutableData对象中
            - 调用NSKeyedArchiver finishingEncoding 结束写入,否则,只要有encoderObject:方法就会写入到 data中
            - 调用NSMutableData wirteToFile: 把 data写到文件夹

    ---重文件同时读出多个数据:
            - 多个对象必须遵守<NSCoding>协议,并实现协议方法

            - 调用 NSData dataWithContentsOfFile:读取文件中的内容,创建 NSData对象

            - 用 NSData对象创建NSKeyedUnarchiver对象    [[NSKeyedUnarchiver alloc]initForReadingWithData:]

            - 用NSKeyedUnarchiver对象读取NSData对象中的内容, decodeObjectForKey;

            - 结束读取  finishingdecoding

    ----读出过程  [NSKeyedUnarchiver unarchiveObjecOfFile:],方法会自动调用对象的<NSCoding>协议方法 initWithCoder方法

/NSUserDefaults/

    ----用该对象来写 app 的偏好设置,写入的文件数据自动保存为 plist文件,保存到沙盒目录的 library/preference;[NSUserDefaults standardUserDefaults]获得单例

    ----默认支持的类型:NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary.

    ----如果想写入自定义的对象,先用让该对象遵守<NSCoding>并实现协议方法>>用NSKeyedArchiver  archivedDataWithRootObject:把对象转换成 NSData 对象>>让后再把该对象写入

    ----读出来的值始终是不可变的,无论你设置的值是不是可变

    ----写入过程(/*不会覆盖原来的数据,写入什么就改变什么*/):/*把原来的数据读出来,然后和新数据一起写入进去*/),效率低,所以不会写入大量的数据
                - (void)setObject:(nullable id)value forKey:(NSString *)defaultName;
                - (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
                - (void)setFloat:(float)value forKey:(NSString *)defaultName;
                - (void)setDouble:(double)value forKey:(NSString *)defaultName;
                - (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
                - (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName

    ----读出过程:注意/*如果设置的是基本数据类型,那么取出来的时候千万不能用objectForKey来取值,否则取出来会跟实际不一样.*/
                               /*如果用了的话要转为相应的基本数据类型*/

                - (nullable id)objectForKey:(NSString *)defaultName;
                - (nullable NSArray *)arrayForKey:(NSString *)defaultName;
                - (nullable NSDictionary<NSString> *)dictionaryForKey:(NSString *)defaultName;
                - (nullable NSData *)dataForKey:(NSString *)defaultName;
                - (nullable NSArray<NSString> *)stringArrayForKey:(NSString *)defaultName;
                - (NSInteger)integerForKey:(NSString *)defaultName;
                - (float)floatForKey:(NSString *)defaultName;
                - (double)doubleForKey:(NSString *)defaultName;
                - (BOOL)boolForKey:(NSString *)defaultName;
收藏
0
sina weixin mail 回到顶部