码迷,mamicode.com
首页 > 移动开发 > 详细

ios中文件存取

时间:2015-09-27 17:34:42      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:

我在开发一个记事本,在想办法解决存储的问题,如何解决存储的问题,存储的几种想法,用文件存储,用sqlite存储,用ios corecode

参考:http://www.2cto.com/kf/201503/383775.html

   http://blog.csdn.net/enuola/article/details/8076221#

http://www.cnblogs.com/kenshincui/p/3885689.html#archiver

第一个问题存在哪?

获取沙盒路径,通过写文件的方式存储数据

iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么.

documents,tmp,app,Library。

(NSHomeDirectory()),

手动保存的文件在documents文件里

Nsuserdefaults保存的文件在tmp文件夹里

1、Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。

2、AppName.app 目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。

3、Library 目录:这个目录下有两个子目录:Caches 和 Preferences
Preferences 目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.
Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。

4、tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。

iphone沙盒(sandbox)中的几个目录获取方式:

// 获取沙盒主目录路径
NSString *homeDir = NSHomeDirectory();
// 获取Documents目录路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
// 获取Caches目录路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];
// 获取tmp目录路径
NSString *tmpDir =  NSTemporaryDirectory();

第二个问题用什么存?

ios中常用文件存取的方法有:

1、直接写文件的方式,可以存储的对象有NSString、NSArray、NSDictionary、NSData、NSNumber,数据全部存放在一个属性列表文件(*.plist文件)中。

2、NSUeserDefaults(偏好设置),用来存储应用设置信息,文件放在perference目录下。

3、归档操作(NSkeyedArchiver),不同于前面两种,它可以把自定义对象存放在文件中。

一、获取沙盒路径,通过写文件的方式存储数据

 

#import "ViewController.h"
@interface ViewController ()
@end
@implementationViewController
- (void)viewDidLoad 
{
    [super viewDidLoad];
    // Do any additional setup after loading the view,typically from a nib.
    [self mainOperation];
}
- (void)mainOperation
{
    //获取沙盒中缓存文件夹路径
    //方法一
    //沙盒主目录
    NSString *homePath = NSHomeDirectory();
    //拼接路径
    NSString *path = [homePath stringByAppendingPathComponent:@"Library/Caches"];
    
    //方法二
    //第一个参数目标文件夹目录(NSCachesDirectory查找缓存文件夹),第二个参数为查找目录的域(NSUserDomainMask为在用户目录下查找),第三个参数为结果中主目录是否展开,不展开则显示为~
    NSArray *arr = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    //虽然该方法返回的是一个数组,但是由于一个目标文件夹只有一个目录,所以数组中只有一个元素。
    NSString *cachePath = [arr lastObject];
    //或者
//    NSString *cachePath = [arr objectAtIndex:0];
   
/**
    //获取沙盒中Document文件夹或者tmp文件夹路径都可使用上面两种方法
    //tmp文件夹路径可直接这样获取
    NSString *tmpPath = NSTemporaryDirectory();
    NSLog(@"%@",tmpPath);
**/
    
    //拼接路径(目标路径),这个时候如果目录下不存在这个lotheve.plist文件,这个目录实际上是不存在的。
    NSString *filePath = [cachePath stringByAppendingPathComponent:@"tese.plist"];
    NSLog(@"%@",filePath);
    
    //创建数据
    NSDictionary *content = @{@"字典数据测试1":@"1",@"字典数据测试2":@"2",@"字典数据测试":@"3"};
    //将数据存到目标路径的文件中(这个时候如果该路径下文件不存在将会自动创建)
    //用writeToFile方法写文件会覆盖掉原来的内容
    [content writeToFile:filePath atomically:YES];
   
    //读取数据(通过字典的方式读出文件中的内容)
    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:filePath];
    NSLog(@"%@",dic);
}
@end

二、使用NSUeserDefaults(偏好设置)实现数据存储

每个应用都有一个NSUesrDefaults实例,通过它可以存储应用配置信息以及用户信息,比如保存用户名、密码、字体大小、是否自动登录等等。数据自动保存在沙盒的Libarary/ Preferences目录下。同样,该方法只能存取NSString、NSArray、NSDictionary、NSData、NSNumber类型的数据。

注意!

NSUeserDefaults只能存储不可变对象。

代码示例:

#import "LXXViewController.h"
@interface LXXViewController ()
@end
@implementationLXXViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = @"NSUserDefaults Demo";
}
//点击button保存数据
- (IBAction)saveData:(id)sender {
    //获取NSUserDefaults对象
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    //存数据,不需要设置路劲,NSUserDefaults将数据保存在preferences目录下
    [userDefaults setObject:@"Lotheve" forKey:@"name"];
    [userDefaults setObject:@"NSUserDefaults" forKey:@"demo"];
    //立刻保存(同步)数据(如果不写这句话,会在将来某个时间点自动将数据保存在preferences目录下)
    [userDefaults synchronize];
    NSLog(@"数据已保存");
}
//点击button读取数据
- (IBAction)getData:(id)sender
{
    //获取NSUserDefaults对象
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    //读取数据
    NSString *name  = [userDefaults objectForKey:@"name"];
    NSString *demo = [userDefaults objectForKey:@"demo"];
    //打印数据
    NSLog(@"name = %@ demo =%@",name,demo);
}
@end

  

三、NSKeyedArchiver(归档操作)

使用归档操作存储数据的主要好处是,不同于前面两种方法只能存储几个常用的数据类型的数据,NSKeyedArchiver可以存储自定义的对象。

代码示例:

需要注意的是,需要保存的对象类一定要引用NSCoding协议,并且实现

接下来看一下自定义的对象如何归档,上面说了如果要对自定义对象进行归档那么这个对象必须实现NSCoding协议,在这个协议中有两个方法都必须实现:

-(void)encodeWithCoder:(NSCoder *)aCoder;通过给定的Archiver对消息接收者进行编码;

-(id)initWithCoder:(NSCoder *)aDecoder;从一个给定的Unarchiver的数据返回一个初始化对象;

Person.h

//
//  Person.h
//  FoundationFramework
//
//  Created by Kenshin Cui on 14-2-16.
//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCoding>

@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int age;
@property (nonatomic,assign) float height;
@property (nonatomic,assign) NSDate *birthday;

@end

  

Person.m

//
//  Person.m
//  FoundationFramework
//
//  Created by Kenshin Cui on 14-2-16.
//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#import "Person.h"

@implementation Person

#pragma mark 解码
-(id)initWithCoder:(NSCoder *)aDecoder{
    NSLog(@"decode...");
    if (self=[super init]) {
        self.name=[aDecoder decodeObjectForKey:@"name"];
        self.age=[aDecoder decodeInt64ForKey:@"age"];
        self.height=[aDecoder decodeFloatForKey:@"heiht"];
        self.birthday=[aDecoder decodeObjectForKey:@"birthday"];
    }
    return self;
}

#pragma mark 编码
-(void)encodeWithCoder:(NSCoder *)aCoder{
    NSLog(@"encode...");
    [aCoder encodeObject:_name forKey:@"name"];
    [aCoder encodeInt64:_age forKey:@"age" ];
    [aCoder encodeFloat:_height forKey:@"height"];
    [aCoder encodeObject:_birthday forKey:@"birthday"];

}

#pragma mark 重写描述
-(NSString *)description{
    NSDateFormatter *formater1=[[NSDateFormatter alloc]init];
    formater1.dateFormat=@"yyyy-MM-dd";
    return [NSString stringWithFormat:@"name=%@,age=%i,height=%.2f,birthday=%@",_name,_age,_height,[formater1 stringFromDate:_birthday]];
}

@end

  

main.m

//
//  main.m
//  FoundationFramework
//
//  Created by Kenshin Cui on 14-2-16.
//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"


int main(int argc,char *argv[]){

    //归档
    Person *person1=[[Person alloc]init];
    person1.name=@"Kenshin";
    person1.age=28;
    person1.height=1.72;
    NSDateFormatter *formater1=[[NSDateFormatter alloc]init];
    formater1.dateFormat=@"yyyy-MM-dd";
    person1.birthday=[formater1 dateFromString:@"1986-08-08"];
    
    NSString *path1=@"/Users/kenshincui/Desktop/person1.arc";
    
    [NSKeyedArchiver archiveRootObject:person1 toFile:path1];

    //解档
    Person *person2= [NSKeyedUnarchiver unarchiveObjectWithFile:path1];
    NSLog(@"%@",person2);
    /*结果:
     name=Kenshin,age=28,height=0.00,birthday=1986-08-08
     */
    
    return 0;
}

  

 

 

 

  

ios中文件存取

标签:

原文地址:http://www.cnblogs.com/franzlistan/p/4842404.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!