plist文件、NSUserDefault 对文件进行存储的类、json格式解析
==========================
文件操作
==========================
Δ一 .plist文件
.plist文件是一个属性字典数组的一个文件;
.plist文件可以用来存储:字典、数组、字符串等对象数据,可以混搭存储
【注】iOS开发中,plist文件一般用于app的配置信息
【注】ios开发工程中,允许多个plist文件共存。
【注】plist文件用来存储小数据量的数据
优点:可视化以及可编辑性非常方便
plist文件的操作
// 例如
NSString* str = @"我是\"美国人\"\n,我爱\"美国\"";
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(@"用户的登陆信息是:\n%@\n%@", 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格式进行校验并规整。
plist文件、NSUserDefault 对文件进行存储的类、json格式解析的更多相关文章
- 【spark】文件读写和JSON数据解析
1.读文件 通过 sc.textFile(“file://") 方法来读取文件到rdd中. val lines = sc.textFile("file://")//文件地 ...
- Swift - .plist文件数据的读取和存储
每次在Xcode中新建一个iOS项目后,都会自己产生一个.plist文件,里面记录项目的一些配置信息.我们也可以自己创建.plist文件来进行数据的存储和读取. .plist文件其实就是一个XML格式 ...
- [Xcode 实际操作]七、文件与数据-(9)编码创建Plist文件(属性列表文件)
目录:[Swift]Xcode实际操作 本文将演示如何通过编码的方式,创建属性列表文件. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit ...
- [Xcode 实际操作]七、文件与数据-(8 )读取和解析Plist文件(属性列表文件)
目录:[Swift]Xcode实际操作 本文将演示如何读取和解析Plist文件,即属性列表文件. 它是用来存储,串行化后的对象的文件. 在项目名称上点击鼠标右键,弹出右键菜单, 选择[New File ...
- Excel文件转plist文件出现的文件编码问题
今天在测试时遇到了需要将大量整理好的Excel数据转换为plist文件的情况.百度了一下教程,发现虽然别人也遇到过类似的情况,但是有些讲的还是不够细致.所以做如下整理. 百度到的内容中有使用Mes ...
- 将DataSet(DataTable)转换成JSON格式(生成JS文件存储)
public static string CreateJsonParameters(DataTable dt) { /**/ /**/ /**/ /* /*********************** ...
- Qt之QDomDocument操作xml文件-模拟ini文件存储
一.背景 不得不说Qt是一个很强大的类库,不管是做项目还是做产品,Qt自身封装的东西就已经非常全面了,我们今天的这篇文章就是模拟了Qt读写ini文件的一个操作,当然是由于一些外力原因,我们决定自己来完 ...
- 上传文件到aws的s3存储
只要有aws-cli客户端就可以上传文件到aws的S3存储.可以在任意机器上.这里以centos为例. 1.安装python.pip. # yum install -y python python-p ...
- InnoDB存储引擎的表空间文件,重做日志文件
存储引擎文件:因为MySQL表存储引擎的关系,每个存储引擎都会有自己的文件来保存各种数据.这些存储引擎真正存储了数据和索引等数据. 表空间文件 InnoDB存储引擎在存储设计上模仿了Oracle,将存 ...
随机推荐
- C#高级知识点&(ABP框架理论学习高级篇)——白金版
前言摘要 很早以前就有要写ABP高级系列教程的计划了,但是迟迟到现在这个高级理论系列才和大家见面.其实这篇博客很早就着手写了,只是楼主一直写写停停.看看下图,就知道这篇博客的生产日期了,谁知它的出厂日 ...
- ABP源码分析八:Logger集成
ABP使用Castle日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等.对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方 ...
- -Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HO 解决办法
最近在使用maven,项目测试的时候出现了这么一个错.-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2 ...
- [Java]Java日期及时间库插件 -- Joda Time.
来到新公司工作也有一个多月了, 陆陆续续做了一些简单的项目. 今天做一个新东西的时候发现了 Joda Time的这个东西, 因为以前用的都是JDK原生的时间处理API, 大家都知道Java原生的时间处 ...
- iOS-开发进阶
iOS完整学习路线图 iOS进阶介绍: 一.iOS-常用的第三方框架的介绍 二.iOS-提高iOS开发效率的方法和工具 三.常用的调试方法 1.iOS-调试技巧 2.iOS-Xcode的使用技巧 四. ...
- python处理命令行参数
直接从命令行执行py文件的时候如果带有参数,如何获取这些参数,如何解析? http://blog.chinaunix.net/uid-20786165-id-3182268.html sys.argv ...
- Java学习笔记(05)
目录: static的用法 主函数的定义 增强for的循环 单例设计模式 封装 一.Static的用法 1.对象的内存分析 对象的引用变量是存在于栈区,而在堆区开辟了一块内存空间,调用对象给成员变量赋 ...
- 【.net 深呼吸】写入日志文件
记录日志,一方面可以把日志写入系统的日志存储中,可在“事件查看器”窗口中查看:如果不喜欢写到系统的日志文件中,也可以写到自己定义的文件中. 其实,日志文件就是文本文件,可能有朋友会想到用写入文本文件的 ...
- 深入理解javascript原生拖放
× 目录 [1]拖放源 [2]拖放目标 [3]dataTransfer对象[4]改变光标 前面的话 拖放(drag-and-drop,DnD)其实是两个动作——拖和放.所以,它涉及到两个元素.一个是被 ...
- MFC&Halcon之实时视频监控
上一篇实现了在MFC的窗体内显示图片,本篇介绍如何在MFC窗体内实时显示摄像头的影像. 要实现的功能是点击一个“开始”按钮,可以显示影像,再点击“停止”按钮,可以停止显示. 因为实时显示影像需要在一个 ...