標籤:
我在開發一個記事本,在想辦法解決儲存的問題,如何解決儲存的問題,儲存的幾種想法,用檔案儲存體,用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中檔案存取