免费开源的iOS开发学习平台

Plist文件操作:4-操作实例

本节内容通过一个实际的案例,介绍一下基于Plist文件的数据持久化方案。该案例可以通过前端的界面输入数据,并保存到Plist文件中,同时可以读取Plist文件中保存的数据。

前端UI界面准备工作

按照下图所示搭建UI界面,添加2个label,2个TextField,2个按钮

建立控件与控制器之间的连线。将2个TextField,2个按钮与ViewController建立连线。两个输入框分别用于获取用户输入的内容,而两个按钮分别用于Plist文件的存取操作。

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *nameTextField;
@property (weak, nonatomic) IBOutlet UITextField *ageTextField;
@end
- (IBAction)writeToPlist:(id)sender {
}
- (IBAction)readFromPlist:(id)sender {
}

创建模型Model

在实际的开发中,苹果官方推荐采用MVC设计模式,因此我们预先创建一个数据模型类来管理数据。

  • 创建一个Person类,其中包含姓名name以及年龄age两个属性
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSNumber *age;
@end
  • 由于Plist文件中只能保存Foundation框架中定义的NSString、NSDictionary以及NSArray等类型的数据,而不能保存对象,所以我们需要在Person.h中添加一个类方法,通过该方法可以把Plist文件中保存的数据转换成对象。
+(instancetype) personWithDict:(NSDictionary *) dict;
  • 在Person.m中实现personWithDict:方法的功能
+(instancetype) personWithDict:(NSDictionary *)dict{
    Person *person = [[Person alloc] init]; 
    person.name = dict[@"name"];
    person.age = dict[@"age"];
    return person;
}

创建用于Plist操作的Service类

为了便于对Plist文件进行读写操作,我们单独创建一个Service类,专门用于读写Plist文件。其中主要包括如下几个方法。

  • 在Service.h文件中添加两个方法,分别用于写入新增数据以及读取所有联系人
-(void) addPersonWithDict:(NSDictionary *) dict;
-(NSArray *) readAllPerson;
  • 在Service.m文件中,实现上述方法的功能
/*获取plist文件的路径*/
-(NSString *) personPlistFilePath {
    NSArray *documentArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);   
    NSString *documentPath = [documentArray firstObject];  
    NSString *personPlistFilePath = [documentPath stringByAppendingPathComponent:@"person.plist"];  
    return personPlistFilePath;
}
-(void)addPersonWithDict:(NSDictionary *) dict{
    //获取Plist文件路径
    NSString *plistPath = [self personPlistFilePath]; 
    //检查Plist文件是否存在
    NSFileManager *fileManager= [NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:plistPath]) { //文件不存在,则创建
        [fileManager createFileAtPath:plistPath contents:nil attributes:nil];
    }
    //读取Plist中的文件
    NSMutableArray *personArrayM = [NSMutableArray arrayWithContentsOfFile:plistPath];
    //判断arrayM是否为空,为空则创建
    if (personArrayM == nil) {
        personArrayM = [NSMutableArray array];
    }
    //传入的dict插入数组中
    [personArrayM addObject:dict];
    //写入文件
    [personArrayM writeToFile:plistPath atomically:YES];
}
-(NSArray *)readAllPerson{ 
    //获取Plist文件路径
    NSString *plistPath = [self personPlistFilePath];
    //读取Plist文件
    NSArray *personArray = [NSArray arrayWithContentsOfFile:plistPath];
    return personArray;   
}

实现写入功能

  • 在ViewController.m文件中,实现写入Plist文件的功能
- (IBAction)writeToPlist:(id)sender {
    //NSString转NSNumber
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    NSNumber *age = [formatter numberFromString:dict[@"age"]];
    //创建Dictionary
    NSDictionary *personItemDict = @{
                                     @"name": self.nameTextField.text,
                                     @"age": age,
                                     };
    //写入Plist文件
    [[[Service alloc] init] addPersonWithDict:personItemDict];
}
  • 运行程序后,输入姓名和年龄,点击按钮【写入Plist】,则输入的数据被写入Plist文件中。注意:可以多次写入不同的数据。

  • 在Finder中查找应用的沙盒,打开person.plist文件,可以查看已经插入的数据。

实现读取功能

  • 在ViewController.m文件中,实现读取Plist文件的功能
- (IBAction)readFromPlist:(id)sender {
    NSArray *personArray = [[[Service alloc] init] readAllPerson];
    for (NSDictionary *dict in personArray) {
        Person *person = [Person personWithDict:dict];
        NSLog(@"%@,%@",person.name, person.age);
    }
}
  • 可以打印出来之前写入Plist文件的数据

示例代码

https://github.com/99ios/13.2.4