美文网首页
iOS中的数据存储<一>

iOS中的数据存储<一>

作者: f1e583c455bf | 来源:发表于2017-05-04 16:43 被阅读0次

一、应用沙盒

一般情况下,iOS每个应用程序都只能访问当前沙盒目录下的文件。

(一)、沙盒目录
沙盒目录
  • Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。
  • Library:1.Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据。
    2.Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录。
  • Temp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。
(二)、获取文件目录的路径
    // 获取沙盒主目录路径
    NSString *HomeFile = NSHomeDirectory();
    NSLog(@"HomeFile%@",HomeFile);
    // 获取Documents目录路径
    NSString *DocumentsFile = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSLog(@"DocumentsFile%@",DocumentsFile);

    // 获取Library的目录路径
    NSString *LibraryFile = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
    NSLog(@"LibraryFile%@",LibraryFile);

    // 获取Caches目录路径
    NSString *CachesFile = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
    NSLog(@"CachesFile%@",CachesFile);

    // 获取Tmp目录路径
    NSString *TmpFile =  NSTemporaryDirectory();
    NSLog(@"TmpFile%@",TmpFile);

获取应用程序中资源的路径方法

    NSLog(@"bundlePath%@",[[NSBundle mainBundle] bundlePath]);
    NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"png"];
    NSLog(@"imagePath%@",imagePath);

    UIImage *testImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
    NSLog(@"%@",testImage);

NSSearchPathForDirectoriesInDomains 方法用于查找目录,返回指定范围内的指定名称的目录的路径集合,有三个参数

  1. directory,表明我们要搜索的目录名称。
  2. domainMask,指定搜索范围,这里的NSUserDomainMask表示搜索的范围限制于当前应用的沙盒目录。
  3. expandTilde,返回YES路径全部显示,返回NO主路径显示~。

二、iOS应用数据存储的几种方式

  1. XML属性列表(plist)归档
  2. Preference(偏好设置)
  3. NSKeyedArchiver归档(NSCoding)
  4. SQLite3
  5. Core Data
(一)、XML属性列表(plist)归档

所谓归档,是一个过程,即用某种格式保存一个或多个对象,以便以后还原这些对象。
属性列表是一种XML格式的文件。如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,就可以使用writeToFile:atomically:方法直接将对象写到属性列表文件中。

**plist归档

    // 获取Documents目录路径
    NSString *DocumentsFile = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSLog(@"DocumentsFile%@",DocumentsFile);
    //获取目录下的plist文件
    NSString *filePath = [DocumentsFile stringByAppendingPathComponent:@"date.plist"];
    NSDictionary *testDict = [NSDictionary dictionaryWithObjects:@[@"1", @"2", @"3"] forKeys:@[@"test1", @"test2", @"test3"]];

    [testDict writeToFile:filePath atomically:YES];
保存的plist文件

**解档

    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];
    [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@-%@", key, obj);
    }];

运行结果:

运行结果
(二)、偏好设置

Preference主要用到NSUserDefaults, NSUserDefaults是一个单例,提供了一个默认的系统编程接口进行交互,一般用来存储应用程序相关的偏好设置,配置数据(比如,保存用户名、字体大小)等,以便于下次启动程序之后能恢复上次的设置。在运行时,可以使用NSUerDefaults对象读取应用程序的默认数据库来获取数据。
NSUerDefaults具有缓存机制,所以不必再每次读取数据的时候都打开应用程序的默认设置数据库。可以通过synchronize方法来使内存中的缓存与系统默认数据库进行同步。

NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL
NSUserDefaults 本身不支持自定义对象的存储, 但是NSUserDefaults可以存储NSData类型,所以在存储自定义类型时,转换成NSData类型来存储。

存入

    //1.获得NSUserDefaults文件
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    //2.向文件中写入内容
    [userDefaults setObject:@"小明" forKey:@"name"];
    [userDefaults setInteger:21 forKey:@"age"];
保存结果

读取

    NSString *name = [userDefaults objectForKey:@"name"];
    NSInteger age = [userDefaults integerForKey:@"age"];

//自定义对象存取
1.创建studentmodel类 要遵循NSCoding协议,并实现协议方法

//StudentModel.h文件
#import <Foundation/Foundation.h>
@interface StudentModel : NSObject<NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end

//StudentModel.h文件
#import "StudentModel.h"

@implementation StudentModel


- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:_name forKey:@"name"];
    [aCoder encodeInteger:_age forKey:@"age"];
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    self = [super init];
    if (self) {
        _name = [aDecoder decodeObjectForKey:@"name"];
        _age = [aDecoder decodeIntegerForKey:@"age"];
    }
    return self;
}
@end
//使用
 StudentModel *model = [[StudentModel alloc]init];
    model.name = @"小红";
    model.age = 18;
    
    //存
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model];
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:data forKey:@"student"];
    
    //取
    NSData *getData = [userDefaults objectForKey:@"student"];
    StudentModel *newModel = [NSKeyedUnarchiver unarchiveObjectWithData:getData];
    NSLog(@"%@,%ld",newModel.name,newModel.age);

如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。

[userDefaults synchronize];

偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。

(三)、NSKeyedArchiver归档(NSCoding)

如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复。
不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以。

  • 存取array类型数据
    NSString *filePath = [DocumentsFile stringByAppendingPathComponent:@"arrayTeat.plist"];
    
    NSArray *array = [NSArray arrayWithObjects:@"1",@"2",nil];
    //存
    [NSKeyedArchiver archiveRootObject:array toFile:filePath];
    //取
    NSArray *getarray = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"%@",getarray);
  • 存取自定义类型数据
    StudentModel *model = [[StudentModel alloc]init];
    model.name = @"小红";
    model.age = 18;
    
    NSString *filePath = [DocumentsFile stringByAppendingPathComponent:@"studentModel.plist"];
    //存
    [NSKeyedArchiver archiveRootObject:model toFile:filePath];
    
    //取 
    StudentModel *newModel = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"%@,%ld",newModel.name,newModel.age);

相关文章

  • iOS数据存储--数据库

    iOS中数据存储方式 iOS中数据存储方式主要有以下几种 Plist NSUserDefaults NSCodin...

  • iOS基础之数据存储

    iOS数据存储 1. 概论 在iOS开发中数据存储的方式可以归纳为两类: 存储文件 和 存储到数据库. 2.文件存...

  • iOS开发-数据存储SQLite介绍

    iOS中数据存储 1.开发中、常见的数据存储有一下几种● Plist(NSArray\NSDictionary)●...

  • iOS数据存储

    iOS数据存储 数据存储

  • Swift之沙盒与数据存储

    应用沙盒结构分析 IOS中的数据存储 1、存储为plist属性列表 2、使用NSUserDefaults存储数据 ...

  • ios CoreData(一)

    CoreData简述 CoreData是ios系统推荐给我们的数据存储方案。在ios中数据存储有多种方式,包括NS...

  • iOS数据存储

    在iOS开发中必不可少的要用到数据存储,数据的处理是iOS开发中的核心技术,适当的对数据进行持久化存储可以实现应用...

  • iOS数据存储之偏好设置和属性列表

    前言 在iOS开发中必不可少的要用到数据存储,数据的处理是iOS开发中的核心技术,适当的对数据进行持久化存储可以实...

  • iOS的数据存储

    背景 在iOS开发中必不可少的要用到数据存储,数据的处理是iOS开发中的核心技术,适当的对数据进行持久化存储可以实...

  • iOS数据库存储之SQLite3

    资源连接: iOS数据库存储之SQL语句; iOS数据存储之文件沙盒; iOS数据存储之NSCoding; SQL...

网友评论

      本文标题:iOS中的数据存储<一>

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