在APP里面,Plist文件常用于数据存储!
- A.应用包里的“plist文件”
NSString * path = [[NSBundle mainBundle]pathForResource:@"RankList.plist" ofType:nil];
NSArray * plistArray = [[NSArray alloc] initWithContentsOfFile:path];
for (NSDictionary * dict in plistArray) {
[self.dataArray addObject:dict];
}
创建:
注意:应用包里的plist文件 只能读取数据!不能写入数据!
[NSBundle mainBundle]
获取到的路径下的文件 不能修改NSString * path = [[NSBundle mainBundle] pathForResource:@"gg.plist" ofType:nil]; NSDictionary * plistDict = [[NSDictionary alloc] initWithContentsOfFile:path]; NSLog(@"plistDict:%@",plistDict); NSDictionary * addDict = @{ @"score":@"123", @"name":@"adama" }; if ([addDict writeToFile:path atomically:YES]) { NSLog(@"将数组保存为属性列表文件成功!!"); NSDictionary * plistDict = [[NSDictionary alloc] initWithContentsOfFile:path]; NSLog(@"plistDict:%@",plistDict); }else{ NSLog(@"将数组保存为属性列表文件不成功"); }
2017-08-26 10:03:31.734 plistTest[1604:54082] plistDict:{ } 2017-08-26 10:03:31.735 plistTest[1604:54082] 将数组保存为属性列表文件成功!! 2017-08-26 10:03:31.735 plistTest[1604:54082] plistDict:{ name = ada; score = da; }
展示存储成功!但并非有效!(每次运行都一样)
plist文件始终不变:
- B.沙盒中的“plist文件”
NSArray *sandboxpath= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //获取完整沙盒路径
NSString *documentsDirectory = [sandboxpath objectAtIndex:0];//documents路径
NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"RankList.plist"];
NSArray * plistDataArray = [[NSArray alloc] initWithContentsOfFile:plistPath];
for (NSDictionary * dict in plistDataArray) {
[self.dataArray addObject:dict];
}
排行榜实现
由于删除、添加、修改数据(考虑到是否存在Plist文件?),故而Plist文件选择在沙盒中创建、使用:
全局变量:
NSString * _jifenStr; //积分数
NSString * _nameStr; //用户名
int _indexWhereAdd; //插入的位置
操作步骤:
NSArray *sandboxpath= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //获取完整路径
NSString *documentsDirectory = [sandboxpath objectAtIndex:0];//沙盒document路径,放着plist文件
NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"RankList.plist"];//plist文件路径
BOOL hasTheRightPlist = NO; //文档路径下 是否含有plist文件
NSFileManager * fileManger = [NSFileManager defaultManager]; //文件管理类
NSArray * dirArray = [fileManger contentsOfDirectoryAtPath:documentsDirectory error:nil];
for (NSString * str in dirArray) { //遍历文件夹(沙盒document路径)
if ([str isEqualToString:@"RankList.plist"]) { //含有“RankList.plist”
hasTheRightPlist = YES;
}
}
if (hasTheRightPlist == YES) { //沙盒document路径 含有“RankList.plist”文件
NSArray * plistArray = [[NSArray alloc] initWithContentsOfFile:plistPath];
for (int i = 0; i < plistArray.count; i++) {
NSDictionary * dict = plistArray[i];
//比较 历史积分、当前积分 进行排行
if([_jifenStr integerValue] > [dict[@"score"] integerValue] ) {//大于 直接插入
UIAlertView * alertV = [[UIAlertView alloc] initWithTitle:@"提交分数" message:@"恭喜进入排行榜" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确认", nil];
[alertV setAlertViewStyle:UIAlertViewStylePlainTextInput];
UITextField * textName = [alertV textFieldAtIndex:0];
textName.placeholder = @"请输入名字";
textName.clearButtonMode = UITextFieldViewModeWhileEditing;
[alertV show];
alertV.tag = 0;
_indexWhereAdd = i;
break;
} else { //小于
if (i == plistArray.count-1 && plistArray.count < 10) { //最后一位 && 个数没超过排行榜限制
UIAlertView * alertV = [[UIAlertView alloc] initWithTitle:@"提交分数" message:@"恭喜进入排行榜" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确认", nil];
[alertV setAlertViewStyle:UIAlertViewStylePlainTextInput];
UITextField * textName = [alertV textFieldAtIndex:0];
textName.placeholder = @"请输入名字";
textName.clearButtonMode = UITextFieldViewModeWhileEditing;
[alertV show];
alertV.tag = 1;
_indexWhereAdd = i;
break;
}
}
}
} else {
UIAlertView * alertV = [[UIAlertView alloc] initWithTitle:@"提交分数" message:@"恭喜进入排行榜" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确认", nil];
[alertV setAlertViewStyle:UIAlertViewStylePlainTextInput];
UITextField * textName = [alertV textFieldAtIndex:0];
textName.placeholder = @"请输入名字";
textName.clearButtonMode = UITextFieldViewModeWhileEditing;
[alertV show];
alertV.tag = 2;
//文件夹下,不存在plist文件 直接添加,必定要创建plist文件
}
#pragma mark - UIAlertViewDelegate
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
UITextField * textNameTF = [alertView textFieldAtIndex:0];
_nameStr = textNameTF.text; //用户名(输入框)
if (buttonIndex == 0 && _nameStr.length > 0) { //确认按钮
NSArray *sandboxpath= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //获取完整路径
NSString *documentsDirectory = [sandboxpath objectAtIndex:0];
NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"RankList.plist"];
NSArray * plistArray = [[NSArray alloc] initWithContentsOfFile:plistPath];
NSMutableArray * addToPlistArr; //存储的数组
if (plistArray) {
addToPlistArr = plistArray.mutableCopy;
} else { //plist数组 不存在
addToPlistArr = @[].mutableCopy;
}
NSDictionary * addDict = @{
@"score":_jifenStr,
@"name":_nameStr
};
switch (alertView.tag) {
case 0:{
[addToPlistArr insertObject:addDict atIndex:_indexWhereAdd];
if (addToPlistArr.count > 10) { //超过10位,移除最后一位
[addToPlistArr removeObjectAtIndex:(addToPlistArr.count-1)];
}
if ([addToPlistArr writeToFile:plistPath atomically:YES]) {
NSLog(@"将数组保存为属性列表文件成功!!");
}else{
NSLog(@"将数组保存为属性列表文件不成功");
}
}break;
case 1:{
[addToPlistArr addObject:addDict];
if ([addToPlistArr writeToFile:plistPath atomically:YES]) {
NSLog(@"将数组保存为属性列表文件成功!!");
}else{
NSLog(@"将数组保存为属性列表文件不成功");
}
}break;
case 2:{
//文件夹下,不存在plist文件 ❤️❤️❤️直接添加,会先创建plist文件❤️❤️❤️
[addToPlistArr addObject:addDict];
if ([addToPlistArr writeToFile:plistPath atomically:YES]) {
NSLog(@"将数组保存为属性列表文件成功!!");
}else{
NSLog(@"将数组保存为属性列表文件不成功");
}
}break;
default:
break;
}
} else {
//AlertView里没有输入任何信息
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.mode = MBProgressHUDModeText;
hud.label.text = @"选择默默无闻,分数不保存";
hud.margin = 10.f;
hud.offset = CGPointMake(0, -60.f);
hud.removeFromSuperViewOnHide = YES;
[hud hideAnimated:YES afterDelay:1.5f];
}
//NSLog(@"%ld",buttonIndex);
}
逻辑判断
判断文件夹路径下是否有“RankList.plist”文件:
不包含:
创建“RankList.plist”文件(数组:Array),并添加一个对象信息(字典:Dictionary)-
包含:存储的数据 排序(积分:_jifenStr)
-
大于 “RankList.plist”文件(数组:Array)中任一元素(对象信息)
数据(Dictionary):
直接插入相应的位置。若插入数据后,若数组个数超过限制(10个):需要移除最后一个元素。
-
不大于 “RankList.plist”文件(数组:Array)中任一元素(对象信息)
数据(Dictionary):数组个数 超过限制(10个):不做处理
数组个数 不超过限制(10个):直接添加到数组最后面
-
goyohol's essay