ios中檔案存取

來源:互聯網
上載者:User

標籤:

我在開發一個記事本,在想辦法解決儲存的問題,如何解決儲存的問題,儲存的幾種想法,用檔案儲存體,用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];    [email protected]"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];    [email protected]"Kenshin";    person1.age=28;    person1.height=1.72;    NSDateFormatter *formater1=[[NSDateFormatter alloc]init];    [email protected]"yyyy-MM-dd";    person1.birthday=[formater1 dateFromString:@"1986-08-08"];        NSString *[email protected]"/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中檔案存取

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.