iOS开发之数据存储

来源:互联网 发布:金融it 编辑:程序博客网 时间:2024/05/23 02:05

一、iOS应用数据存储的常用方式

- XML属性列表(plist)归档- Preference(偏好设置) 本质还是通过“plist”来存储数据, 但是使用更简单(无需关注文件、文件夹路径和名称)- NSKeyedArchiver归档(NSCoding) 把任何对象, 直接保存为文件的方式。- SQLite3 当非常大量的数据存储时使用- Core Data 就是对SQLite的封装   

二、获取路径

    - 获取bundle路径      NSString *path = [NSBundle mainBundle].bundlePath;    -获取沙盒路径      NSString *home = NSHomeDirectory();

三、沙盒路径目录结构

    -Document          保存应用运行时生成的需要持久化的数据    -library        Caches         保存应用运行时生成的需要持久化的数据        Preferences    保存应用的所有偏好设置    -temp              保存应用运行时所需的临时数据

四、利用沙盒根目录拼接”Documents”字符串

  • 方式一:(拼接字符串)

    NSString *home =NSHomeDirectory();NSString *documents = [home stringByAppendingString:@“/Documents"];
  • 方式二:(作为路径的一部分)

    NSString *home =NSHomeDirectory();NSString*documents =[homestringByAppendingPathComponent:@"Documents"];
  • 方式三:()

    参数1:目标文件,参数二:作用域, 参数三:是否展开波浪线[NSSearchPathForDirectoriesInDomains(<#NSSearchPathDirectory directory#>, <#NSSearchPathDomainMask domainMask#>, <#BOOL expandTilde#>)]NSString * documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

五、获取caches文件夹路径

//获取caches文件夹

NSString * cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, NO) lastObject];

六、获取偏好设置文件夹路径

  NSTemporaryDirectory()

七、plist数据的存储与读取

  • //数据存储

        NSArray * names = [NSArray arrayWithObjects:@"Bob",@"王宝", @"球童",@"Jack",nil];  // 1.获取路径 NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];  // 2.拼接文件名NSString * filePath = [path stringByAppendingPathComponent:@"names.plist"];// 3. 存储// atomically 是否允许原子写入[names writeToFile:filePath atomically:YES];NSLog(@"%@",filePath);

  • 读取数据

    //1.获取数据路径NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];//2.拼接文件路径NSString * filePath = [path stringByAppendingPathComponent:@"names.plist"];//3.读取数据NSArray * names = [NSArray arrayWithContentsOfFile:filePath];NSLog(@"%@",names);

八、plist数据的存储与读取

  • //偏好设置存储

    //1.获取NSUserDefaults对象NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];//2.存储数据[userDefaults setObject:@"Jack" forKey:@"name"];[userDefaults setInteger:23 forKey:@"age"];[userDefaults setBool:YES forKey:@"sex"];//3.立即存储[userDefaults synchronize];NSLog(@"%@",NSHomeDirectory());

  • //读取偏好设置

    //1.获取NSUserDefaults对象NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];//2.读取数据NSString * name = [userDefaults objectForKey:@"name"];NSInteger age = [userDefaults integerForKey:@"age"];BOOL sex = [userDefaults boolForKey:@"sex"];NSLog(@"name =%@  age = %ld sex = %d",name,age,sex);

九、归档与反归档

“归档”:是一种可以把任何对象,直接保存为文件的方式。

- 如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复- 不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以- NSCoding协议有2个方法:- encodeWithCoder:     每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量- initWithCoder: 每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量

CZPerson.h
[x] 注意:改方法要遵守NSCodiing协议

#import <Foundation/Foundation.h>@interface CZPerson : NSObject<NSCoding@property (nonatomic,copy) NSString * name;@property (nonatomic,copy) NSString * phone;@end

CZPerson.m
[x] 注意:实现NSCodiing协议的方法*

#import "CZPerson.h"@implementation CZPerson//确定要存储对象的哪些属性- (void)encodeWithCoder:(NSCoder *)aCoder{    [aCoder encodeObject:self.name forKey:@"name"];    [aCoder encodeObject:self.phone forKey:@"phone"];}//确定要读取对象的哪些属性- (id)initWithCoder:(NSCoder *)aDecoder{    if(self = [super init])    {        self.name = [aDecoder decodeObjectForKey:@"name"];        self.phone = [aDecoder decodeObjectForKey:@"phone"];    }    return self;}@end

ViewController.m

#import "ViewController.h"#import "CZPerson.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.    //反归档 (反序列化)    //1.获取路径    NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];    //2.拼接文件名    NSString * filePath = [path stringByAppendingPathComponent:@"person"];    //3.通过反归档读取数据    CZPerson * p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];    NSLog(@"name =%@  phone = %@",p.name,p.phone);//    [self test01];}//归档 (序列化)- (void) test01{    //创建person对象    CZPerson * person = [[CZPerson alloc] init];    //赋值    person.name = @"JackMeng";    person.phone = @"186000001";    //获取路径    NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];    //拼接文件名    NSString * filePath = [path stringByAppendingPathComponent:@"person"];    // 归档    [NSKeyedArchiver archiveRootObject:person toFile:filePath];    NSLog(@"%@",NSHomeDirectory());}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}@end

ViewController.h

#import "ViewController.h"#import "CZPerson.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.    //反归档 (反序列化)    //1.获取路径    NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];    //2.拼接文件名    NSString * filePath = [path stringByAppendingPathComponent:@"person"];    //3.通过反归档读取数据    CZPerson * p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];    NSLog(@"name =%@  phone = %@",p.name,p.phone);//    [self test01];}//归档 (序列化)- (void) test01{    //创建person对象    CZPerson * person = [[CZPerson alloc] init];    //赋值    person.name = @"JackMeng";    person.phone = @"186000001";    //获取路径    NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];    //拼接文件名    NSString * filePath = [path stringByAppendingPathComponent:@"person"];    // 归档   [NSKeyedArchiver archiveRootObject:person toFile:filePath];    NSLog(@"%@",NSHomeDirectory());}@end
0 0