zoukankan      html  css  js  c++  java
  • plist文件、NSUserDefault 对文件进行存储的类、json格式解析

    ==========================

    文件操作

    ==========================

    Δ一 .plist文件

    .plist文件是一个属性字典数组的一个文件;

    .plist文件可以用来存储:字典、数组、字符串等对象数据,可以混搭存储

    【注】iOS开发中,plist文件一般用于app的配置信息

    【注】ios开发工程中,允许多个plist文件共存。

    【注】plist文件用来存储小数据量的数据

    优点:可视化以及可编辑性非常方便

    plist文件的操作

             // 例如

            NSString* str = @"我是"美国人" ,我爱"美国"";

            NSLog(@"%@",str);

     1.创建plist文件

            NSMutableDictionary* dic = [[NSMutableDictionary alloc]init];

            [dic setObject: @"张三" forKey: @"name"];

            [dic setObject: @"李四" forKey: @"name1"];

            [dic  setObject: @"王二" forKey: @"name2"];

            

            //【注】如果key相同,数据会被冲掉

            [dic setObject: @"zhangsan" forKey: @"name"];

            

            // 把数据写入文件

            //【了解】atomically

            // atomically:参数意思,原子操作

            // 如果atomically的参数是yes,程序会把数据先备份一下,等全部写入到了缓存中再一次性写入文件

            // 如果atomically的参数是no,程序会直接把数据写入缓存

            [dic writeToFile:Path atomically:YES];

    2.创建一种多键值的plist文件

            

            NSMutableDictionary* plugin1 = [[NSMutableDictionary alloc]init];

            [plugin1 setObject: @"张三1" forKey: @"name1"];

            [plugin1 setObject: @"李四" forKey: @"name2"];

            

            NSMutableDictionary* plugin2 = [[NSMutableDictionary alloc]init];

            

            [plugin2 setObject: @"王二" forKey: @"name1"];

            [plugin2 setObject: @"赵五" forKey: @"name2"];

           

            NSMutableDictionary* listDic = [[NSMutableDictionary alloc]init];

            [listDic setObject:plugin1 forKey: @"初中一班"];

            [listDic setObject:plugin2 forKey: @"初中二班"];

            

            [listDic setObject: @"一哥" forKey: @"name"];

            

            [listDic writeToFile:Path atomically:YES];

            

    3.对某一个属性进行修改

            //∆∆∆∆首先应该先读取当前plist文件,读出所有数据

            // 读取指定目录下的文件内容

            NSMutableDictionary* appList = [[NSMutableDictionary alloc]initWithContentsOfFile:Path];

            [appList setObject: @"二哥" forKey: @"name"];     

            NSMutableDictionary* chu1 = [appList objectForKey: @"初中一班"];

            NSString* name1 = [chu1 objectForKey: @"name1"]; 

            [[appList objectForKey: @"初中一班"] objectForKey: @"name1"];    

            // 通过取出的内容,重新组合一个新的内容,把新的内容数据重新存入plist中

            [chu1 setObject:@"qianqian" forKey: @"name1"];

            [appList setObject:chu1 forKey: @"初中一班"]; 

            [appList writeToFile:Path atomically:YES];

    【总结】

    1.plist文件操作其实就是一个根目录是字典,内部数据各种嵌套操作。

    2.如果想要修改plist中的某个字段内容,一层一层去找,找到后一层一层封装回来,重新写入文件。(文件的覆盖过程)

    3.plist不允许出现key值重名,如果重名,会把之前的名称下的值给冲掉。

    二.NSUserDefault 对文件进行存储的类

    1. NSUserDefault是一个本地数据存储类,可以存储小数据量的信息。

    2. NSUserDefault 在iOS中常用来存储用户的个人信息,以及登陆注册信息。

    【注】到目前为止,大家所学的归档、写文件、NSUserDefault都是存储小数据量信息的类,他们可以存储大数据量但是会出现性能问题。存储大数据量信息用【数据库】

    【数据库】

    1.SQlite 底层的数据,需要自己手动去创建数据库文件(db),并且需要手动去书写sqlite 语句;

    2.【core data】是苹果公司提供的一种数据库存储、查询、修改、删除等操作一种解决方案;core data数据库其实就是一个对sqlit3进行封装的类库。

    3.第三方数据库。 

    Δ【学习NSUserDefault】

       // userDefault Demo

            // NSUserDefaults 是一个单例类,调用单例方法

            NSUserDefaults* defaul = [NSUserDefaults standardUserDefaults];

            

            // 设置key和value

            [defaul setObject: @"15588605664" forKey: @"userName"]; 

            [defaul setObject: @"123456" forKey: @"password"];

            NSArray* classInfo = @[@"初中一班", @"66个同学", @"平均成绩99.98", @{@"key":@"value"}];

            [defaul setObject:classInfo forKey: @"clss_Info"]; 

           [defaul setObject: @"1" forKey: @"status"];

            [defaul setBool:YES forKey: @"status"];

            [defaul setInteger:1 forKey: @"int"];

            [defaul setObject:[NSNumber numberWithBool:YES] forKey: @"status1"];

            [defaul setFloat:0.15 forKey: @"float"];

            

            //   把刚才设置的内容存储到程序给NSUserDefaults所分配的空间文件中

            //   系统会把NSUserDefaults存储的文件都放到app的一个指定的目录,其实这个目录就是在根目录的library目录下一个新的目录下

            // ∆∆∆∆[注]synchronize 一定要写这个方法,可以确保数据万无一失,如果不写这个方法,可能会存在数据没有保存成功的情况,例如在多线程中进行数据保存;

            [defaul synchronize];

            // =================================

            // 读取文件的方式

            

            NSString* userName = [defaul objectForKey: @"userName"];

            NSString* pwd = [defaul objectForKey: @"password"];

            // 只要是牵扯到key和value的,那么存储的时候key怎么写,取的时候,key必须怎么写

            // 只要是牵扯到key和value的,那么存储的key如果一样,肯定会发生覆盖

            NSArray* ClassAllInfo = [defaul objectForKey: @"clss_Info"];

            

            BOOL isok = [defaul objectForKey: @"status"];

            

            float f1 = [defaul floatForKey: @"float"];

            NSInteger i = [defaul integerForKey: @"int"];

            BOOL b = [defaul boolForKey: @"status"];

            

            NSLog(@"用户的登陆信息是: %@ %@", userName, pwd);

            NSLog(@"%@",ClassAllInfo);

    【注】NSUserDefault 可以存储的数据类型有:NSNumber(NSInterger、flost、double),NSDictionary,NSArray、Bool,NSString这些数据类型

    Δ.【扩展知识— c语言 转义字符】

    转义字符就是用来解决程序中的一些特殊符号导致编码出错的问题。比如:

    【注】对要进行转义的字符每个前面都要写

    1.‘

    2.“

    3. 回车

    4.等等非常多

    【扩展】

    1.编程中文件的命名最好不要有中文、空格、特殊符号(因为计算机会对中文或者空格或者特殊符号进行转义)

    2.文件和内存数据之间的转换关系

    cpu(计算机处理数据大脑)所有的数据都是按照cpu的指令去调度执行

    本地文件——>内存           (读的过程)

    内存      ——>本地文件     (写的过程)

    【注】代码中定义的变量或者对象变量,这些变量的内容都是在内存中存储运算。如果想把一些有用的信息永久保留,就需要把信息保存到文件中。

    (1).内存中的数据,都是一些临时数据,当计算机发生意外情况(断电),内存中的数据都会消失;

    (2).把内存中的输入写入到文件中,就可以永久保存,只要文件没有被删除。

    三.json格式解析

    1.json

    2.xml

    【比较】xml格式出现的比json格式早,xml就是表单(表格)(<body>name</body>),xml最致命的缺点就是可阅读性不高,导致程序员解析比较麻烦。xml优点是应用到大数据量。但是,随着移动端的兴起,json这种格式也开始流行。逐渐成为ios平台和安卓平台app端获取数据一种格式。json格式优点:格式清晰,应用于小数据量的获取

     // 例如

    #import <Foundation/Foundation.h>

    #import "MyModel.h"

    #import "UserModel.h"

    #define PATH @"http://m2.qiushibaike.com/article/list/latest?page=1&count=30&rqcnt=21&r=a1ef5f561429944164282"

    int main(int argc, const char * argv[]) {

        @autoreleasepool {

            // 协议很多种:http  ftp  mail  file socket xmpp

            // url格式:  协议://域名(ip地址):端口/路径 ?参数列表(以&符间隔每个参数)

             // 将字符串转换成NSURL类型

            NSURL *url = [NSURL URLWithString:PATH];

            // 通过url获取数据

             // NSData *data1 = [[NSData alloc] initWithContentsOfFile: @""];

            NSData *data = [[NSData alloc] initWithContentsOfURL:url];

            //  NSLog(@"%@",data);

            

            NSError *error = nil;

            // NSJSONSerialization苹果系统自带解析,此方法是把data解析成NSDictionary 操作读取可变内容

            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

            if (error) {

                NSLog(@"解析失败");

                exit(-1);

            }

            

            NSLog(@"%@",dic);

            NSArray *array = [dic objectForKey:@"items"];

            //  NSLog(@"%@",array);

            

            // 创建一个可变数组用于存放myModel这个模型

            NSMutableArray *dataArray = [[NSMutableArray alloc] init];

            

            for (int i = 0; i < array.count; i++) {

                

                MyModel *myModel = [[MyModel alloc] init];

                NSDictionary *dicItem = array[i];

                // 这里的key一定要对应url返回来字段值

                myModel.content = [dicItem objectForKey: @"content"];

                myModel.modelId = [dicItem objectForKey: @"id"];           

                if (![[dicItem objectForKey:@"user"] isMemberOfClass:[NSNull class]] ) {

                    NSDictionary *userDic = [dicItem objectForKey: @"user"];

                    UserModel *userModel = [[UserModel alloc] init];

                    //  NSLog(@"%@",[userDic objectForKey: @"avatar_updated_at"]);

                    userModel.avatar_updated_at = [userDic objectForKey: @"avatar_updated_at"];

                    userModel.created_at = [userDic objectForKey: @"created_at"];

                    userModel.last_device = [userDic objectForKey: @"last_device"];

                    myModel.user = userModel;

                }

                [dataArray addObject:myModel];

            }

            

            //  NSLog(@"可变数组个数:%lu",dataArray.count);

            for (MyModel *myModel in dataArray) {

                NSLog(@"content:%@,modelId:%@", myModel.content, myModel.modelId);

                UserModel *userModel = myModel.user;

                NSLog(@"更新时间:%@,创建时间:%@,最终设备:           %@",  userModel.avatar_updated_at, userModel.created_at,  userModel.last_device);

            }

        }

        return 0;

    }

    #import <Foundation/Foundation.h>

    #import "UserModel.h"

    @interface MyModel : NSObject

    @property (nonatomic,copy) NSString *content;

    @property (nonatomic,copy) NSString *modelId;

    @property (nonatomic,strong) UserModel *user;

    @end

    #import <Foundation/Foundation.h>

    @interface UserModel : NSObject

    @property (nonatomic,copy) NSString *avatar_updated_at;

    @property (nonatomic,copy) NSString *created_at;

    @property (nonatomic,copy) NSString *last_device;

     @end

    【注】可以利用http://www.bejson.com/     对json格式进行校验并规整。

  • 相关阅读:
    【ACM】nyoj_139_我排第几个_201308062046
    【ACM】poj_2356_Find a multiple_201308061947
    【ACM】hdu_zs2_1007_Problem G _201308031028
    【ACM】hdu_zs2_1006_Problem F_201308031058
    【ACM】hdu_zs2_1005_Problem E _201308030747
    【ACM】hdu_zs2_1004_Problem D _201308030856
    【葡萄城报表案例分享】项目施工进度报告 – 树形报表
    【葡萄城报表案例分享】电力设备生产数据的多层分组统计报表实现
    葡萄城报表之多维透视表 – 矩表实现商品销售对比统计
    葡萄城报表之矩表 – 现代数据分析中必不可少的报表工具
  • 原文地址:https://www.cnblogs.com/ljcgood66/p/5321882.html
Copyright © 2011-2022 走看看