iOS数据存储

作者: 小鬼的世界 | 来源:发表于2016-04-26 19:24 被阅读150次

    简单数据的存储

    1. 获取沙盒的位置

    NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    

    也可以使用

    NSString *homePath = NSHomeDirectory();
        NSString *documentPath2 = [homePath stringByAppendingPathComponent:@"Documents"];
    

    2. 简单数据的存储

    2.1 NSString
    (1)创建txt文件

    NSString *str = @"ADC";
        NSString *strFilePath = [documentPath stringByAppendingPathComponent:@"str.txt"];
    
    

    (2)写入数据

    [str writeToFile:strFilePath atomically:YES];
    

    (3)读取数据

    NSString *readStr = [[NSString alloc] initWithContentsOfFile:strFilePath encoding:NSUTF8StringEncoding error:nil];
    

    2.2 NSArray

    //先创建一个存储array对象的txt文件路径
    NSString *arrPath = [documentPath stringByAppendingPathComponent:@"array.txt"];
    //使用字面量创建Array
        NSArray *nameArr = @[];
    //将数据写入txt文件路径
        [nameArr writeToFile:arrPath atomically:YES];
    //从路径读取出数据
        NSArray *arr = [NSArray arrayWithContentsOfFile:arrPath];
    

    2.3 字典

    //字典的处理步骤同NSArray  
    NSString *dictPath = [documentPath stringByAppendingPathComponent:@"dict.txt"];
        
        NSDictionary *dict = @{};
        [dict writeToFile:dictPath atomically:YES];
        
        NSDictionary *readDict = [NSDictionary dictionaryWithContentsOfFile:dictPath];
    

    2.4 NSData

    NSString *imgPath = [documentPath stringByAppendingPathComponent:@"img.txt"];
        UIImage *image = [UIImage imageNamed:@"address"];
    //将图片转换成NSData类型
        NSData *imgData = UIImagePNGRepresentation(image);
        
        [imgData writeToFile:imgPath atomically:YES];
        //读取图片
        UIImage *img = [UIImage imageWithContentsOfFile:imgPath];
    

    2.5 从资源包读取图片

    //获取绝对路径
    NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"address" ofType:@"png"];
    //通过路径加载图片
        UIImage *image1 = [UIImage imageWithContentsOfFile:imagePath];
        
        imageView.image = image1;
        
        [self.view addSubview:imageView];
        
        UIView *view = [[NSBundle mainBundle] loadNibNamed:@"a" owner:self options:nil][0];
    

    数据,文件操作

    1. 声明文件的路径
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    
    1. 创建txt文件及其路径
    NSString *filePath = [documentPath stringByAppendingPathComponent:@"file.txt"];
    
    1. 创建FileManager,并初始化文件
    NSFileManager *fileManager = [NSFileManager defaultManager];
        
        [fileManager createFileAtPath:filePath contents:strData attributes:nil];
    
    1. 读取数据
    NSData *readStrData = [fileManager contentsAtPath:filePath];
        NSString *str1 = [[NSString alloc] initWithData:readStrData encoding:NSUTF8StringEncoding];
    
    1. 移动文件
      5.1 创建目标文件的路径
    NSString *moveFilePath = [topath stringByAppendingPathComponent:@"file.txt"];
    

    5.2 移动文件

        [fileManager moveItemAtPath:filePath toPath:moveFilePath error:nil];
    
    1. 复制文件
    NSString *copyPath = [documentPath stringByAppendingPathComponent:@"备份/copy.txt"];
        
        [fileManager createDirectoryAtPath:[copyPath stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:nil];
        
        [fileManager copyItemAtPath:moveFilePath toPath:copyPath error:nil];
    
    1. 获取文件信息(文件大小)
    NSDictionary *dic = [fileManager attributesOfItemAtPath:filePath error:nil];
        
        NSInteger fileLength = [dic[NSFileSize] integerValue];
    
    1. 判断文件是否存在
    [fileManager fileExistsAtPath:filePath]
    

    使用NSFileHandle操作文件

    //先通过fileManager创建文件并在里面写入内容
        NSFileManager *fileManager = [NSFileManager defaultManager];
        
        NSString *documentPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
        
        NSString *filePath = [documentPath stringByAppendingPathComponent:@"file.txt"];
        
        [fileManager createFileAtPath:filePath contents:[@"abc" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
    

    修改内容

    NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
        //查找到文件最末端
        [fileHandle seekToEndOfFile];
        [fileHandle writeData:[@"123" dataUsingEncoding:NSUTF8StringEncoding]];
        
        [fileHandle closeFile];
    

    读取文件

    NSFileHandle *readFileHandle = [NSFileHandle fileHandleForReadingAtPath:filePath];
        //读取长度
        NSUInteger length = [[readFileHandle availableData] length];
        //设置偏移位置
        [readFileHandle seekToFileOffset:length/2];
        //从偏移位置开始读取到文件末尾
        NSData *readData = [readFileHandle readDataToEndOfFile];
        
        NSString *readStr = [[NSString alloc] initWithData:readData encoding:NSUTF8StringEncoding];
    

    复制文件

    NSString *copypath = [documentPath stringByAppendingPathComponent:@"copy.txt"];
        [fileManager createFileAtPath:copypath contents:nil attributes:nil];
    
        //打开文件准备写入
        NSFileHandle *copyHandle = [NSFileHandle fileHandleForWritingAtPath:copypath];
        //writeData会直接覆盖原来的
        [copyHandle writeData:readData];
        
        [copyHandle closeFile];
    

    文件的归档与反归档

    要进行归档, 必须先让类继承<NSCoding>并实现两个方法

    //反序列化
    - (instancetype)initWithCoder:(NSCoder *)aDecoder {
        self = [super init];
        if (self) {
            self.name = [aDecoder decodeObjectForKey:@"name"];
            self.age = [aDecoder decodeIntegerForKey:@"age"];
        }
        return self;
    }
    //序列化
    - (void)encodeWithCoder:(NSCoder *)aCoder {
        [aCoder encodeObject:self.name forKey:@"name"];
        [aCoder encodeInteger:self.age forKey:@"age"];
    }
    
    

    归档过程:Person对象-->NSData-->writeFile

    NSMutableData *mulData = [NSMutableData data];
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mulData];
        [archiver encodeObject:person forKey:@"Person"];
        [archiver finishEncoding];
    

    写入文件

    NSString *personDataPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/person.txt"];
       
        [mulData writeToFile:personDataPath atomically:YES];
    

    反归档过程: 从文件里面读取-->NSData-->Person对象

    NSData *personData = [NSData dataWithContentsOfFile:personDataPath];
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:personData];
        Person *person1 = [unarchiver decodeObjectForKey:@"Person"];
        NSLog(@"perosn1 = %@", person1);
    

    另外,还有一个系统单利类可以进行数据存储

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:@"123" forKey:@"userName"];
    

    相关文章

      网友评论

        本文标题:iOS数据存储

        本文链接:https://www.haomeiwen.com/subject/riaqrttx.html