一、四種本地化方式
1、XML屬性列表(plist)
2、NSUserDefaults(Preference多是偏好設置)
3、NSKeyedArchiver歸檔
4、SQLite數據庫
二、sandbox沙盒概念補充
基本概念
每個IOS應用程序都有自己的應用沙盒,可以將沙盒簡單的理解為應用的文件夾,每個應用的沙盒都是相互獨立的,其他應用不能訪問該沙盒,他也不能訪問其他應用的沙盒。
結構與用途
Documents:保存應用運行時生成的需要持久化的數據,iTunes同步設備時會備份該目錄。重要數據
Library/Caches:保存應用運行時生成的需要持久化的數據,iTunes同步設備不會備份該目錄。非重要數據
Library/Preference:保存應用的偏好設置,iTunes同步設備時會備份該目錄。
tmp:保存應用運行時所需的臨時數據,使用完畢后再將相應的文件從該目錄刪除。應用沒有運行時,系統也可能會清除該目錄下的文件。iTunes同步設備時不會備份該目錄。
沙盒目錄的獲取方式
1、Documents文件夾的獲取方式
// 利用沙盒根目錄拼接字符串
NSString*homePath = NSHomeDirectory();
NSString*docPath = [homePath stringByAppendingString:@"/Documents"];
// 利用沙盒根目錄拼接”Documents”字符串
NSString*homePath = NSHomeDirectory();
NSString*docPath = [homePath stringByAppendingPathComponent:@"Documents"];
// NSDocumentDirectory 要查找的文件
// NSUserDomainMask 代表從用戶文件夾下找
// 在iOS中,只有一個目錄跟傳入的參數匹配,所以這個集合里面只有一個元素
NSString*path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES)[0];
NSString*filePath = [path stringByAppendingPathComponent:@"xxx.plist"];
這里的參數說明一下:
第一個參數:枚舉類型,常用的有
NSDocumentDirectory(Documents文件夾)
NSCachesDirectory(Library/Caches)
第二個參數:NSUserDomainMask,表示從用戶文件夾下找。
第三個參數:打印的路徑會是這種形式~/Documents,我們一般都會用YES,這樣可以獲取完整路徑字符串。
這個方法的返回值是一個數組,但在iOS中,只有一個目錄跟傳入的參數匹配,所以這個集合里面只有一個元素,所以我們取第一個元素
2、Library/Caches文件夾的獲取方式
NSString*path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask,YES)[0];
NSString*filePath = [path stringByAppendingPathComponent:@"student.data"];
3、tmp文件夾的獲取方式
NSString *tmp=NSTemporaryDirectory();
三、存儲方式介紹
1、四大存儲方式之一:XML屬性列表
可存儲的數據類型:NSArray、NSDictionary、NSString
文件歸檔:
NSArray*arr = [[NSArrayalloc] initWithObjects:@"1", @"2",nil];
NSString*path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES)[0];
NSString*filePath = [path stringByAppendingPathComponent:@"xxx.plist"];
[arr writeToFile:filePath atomically:YES];
文件解檔:
NSString*path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES)[0];
NSString*filePath = [path stringByAppendingPathComponent:@"xxx.plist"];// 解檔
NSArray*arr = [NSArray arrayWithContentsOfFile:filePath];
2、四大存儲方式之二:NSUserDefaults
NSUserDefaults:用來保存應用程序設置和屬性、用戶保存的數據。
可以存儲的數據類型:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存儲其他類型,則需要轉換為前面的類型,才能用NSUserDefaults存儲。
簡單使用一:存儲字符串
如果想要將字符串永久保存到NSUserDefaults中去,只需要簡單的操作(一個Value 一個Key ),對相同的Key賦值約等于一次覆蓋,要保證每一個Key的唯一性。
//將NSString 對象存儲到 NSUserDefaults 中
NSString*passWord = @"1234567";
NSUserDefaults*user = [NSUserDefaults standardUserDefaults];
[user setObject:passWord forKey:@"userPassWord"];
//取出數據
NSUserDefaults*user = [NSUserDefaults standardUserDefaults];
NSString*passWord = [ user objectForKey:@"userPassWord"];
簡單使用二:可變數組
NSUserDefaults 存儲的對象全是不可變的,例如,如果我想要存儲一個 NSMutableArray 對象,必須先轉換成不可變數組(NSArray)再存儲,同樣,取出來的也是不可變數組,要使用可變數組需要再次轉換。
//存儲數組
NSMutableArray*mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234",nil];
NSArray* array = [NSArrayarrayWithArray:mutableArray];
NSUserDefaults*user = [NSUserDefaults standardUserDefaults];
[user setObject:array forKey:@"記住存放的一定是不可變的"];
NSUserDefaults*user = [NSUserDefaults standardUserDefaults];//轉換成可變數組
NSMutableArray*mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"記住存放的一定是不可變的"]];
簡單使用三:非上述類型則需要轉化成上述類型,例如圖片
//存數據UIImage*image=[[UIImagealloc] initWithContentsOfFile:@"photo.jpg"];
NSData *imageData = UIImageJPEGRepresentation(image,100);//UIImage對象轉換成NSData
[[NSUserDefaults standardUserDefaults] setObject:imageData forKey:@"image"];
[[NSUserDefaults standardUserDefaults] synchronize];//用synchronize方法把數據**強行**持久化到standardUserDefaults數據庫中,因為NSUserDefaults存儲數據不是及時的
//取數據NSData *imageData = [[NSUserDefaults standardUserDefaults] dataForKey:@"image"];
UIImage*Image = [UIImage imageWithData:imageData];//NSData轉換為UIImage
簡單使用四:自定義對象,將自定義類型轉換為NSData類型
當想存儲對象數組時,你可以使用用SQLite 存儲 ,也可以使用NSUserDefaults來存儲,需要注意的是雖然NSUserDefaults可以存儲不可變數組,但是數組中只限制基本數據類型,如果是對象的話,是不行的,此時我們可以將自定義對象類型通過歸檔轉化成NSData類型再進行存儲,此時,該對象模型需要遵守NSCoding協議,并且要實現實現encodeWithCoder和initWithCoder方法,前者是將對象進行編碼,后者用來解碼。
以Student類為例。
首先 .h 文件中要繼承NSCoding協議,.m文件如下:
- (void)encodeWithCoder:(NSCoder *)coder{
? ? ? ? ? [coder encodeObject:self.nameforKey:@"name"];
? ? ? ? ? [coder encodeInteger:self.ageforKey:@"age"];
}
- (instancetype)initWithCoder:(NSCoder *)coder{
? ? ? ? ? self= [super init];
? ? ? ? ? if(self) {
? ? ? ? ? ? ? ? ? ?self.age= [coder decodeIntegerForKey:@"age"];
? ? ? ? ? ? ? ? ? ?self.name= [coder decodeObjectForKey:@"name"];
? ? ? ? ? }
? ? ? ? ? return self;
}
存儲一個學生信息
//存數據Student *student = [[Student alloc] ini];
//下面進行的是對student對象的 name , studentNumber ,sex 的賦值
student.name= @"LOLITA";
student.age= @"24";
//將student類型變為NSData類型
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"oneStudent"];
//取數據
NSdData*data= [[NSUserDefaults standardUserDefaults] objectForKey:@"oneStudent"];
Student*student = [NSKeyedUnarchiverunarchiveObjectWithData:data];
存儲多個數據時候,可以使用for循環,將所有的學生信息存儲到一個可變數組中,再可變數組轉化成不可變數組,最后使用歸檔轉化成NSData類型進行存儲
//記住要轉換成不可變數組類型
NSArray* array = [NSArray arrayWithArray:dataArray];
[[NSUserDefaults standardUserDefaults] setObject:array forKey:@"allStudent"];
NSdData*data= [[NSUserDefaults standardUserDefaults] objectForKey:@"allStudent"];
NSArray*allStudentArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
3、四大存儲方式之三:歸檔NSKeyedArchiver
采用歸檔的形式來保存數據,該數據對象需要遵守NSCoding協議,并且該對象對應的類必須提供encodeWithCoder:和initWithCoder:方法。前一個方法告訴系統怎么對對象進行編碼,而后一個方法則是告訴系統怎么對對象進行解碼。例如對Possession對象歸檔保存
//定義Possession:
.h
@interfacePossession:NSObject//遵守NSCoding協議
{
? ? ? ? ? NSString*name;//待歸檔類型
}
.m
@implementationPossession
-(void)encodeWithCoder:(NSCoder *)aCoder{
? ? ? ? ? [aCoder encodeObject:name forKey:@"name"];
}
-(void)initWithCoder:(NSCoder *)aDecoder{
? ? ? ? ? ? name=[[aDeCoder decodeObjectforKey:@"name"] retain];
}
//歸檔
NSString*path = @"xxxxxxxxx";
[NSKeyedArchiver archiveRootObject:allPossessions toFile: path];
//解檔
allPossessions=[NSKeyedUnarchiver unarchiveObjectWithFile:path];
缺點:歸檔的形式來保存數據,只能一次性歸檔保存以及一次性解壓。所以只能針對小量數據,而且對數據操作比較笨拙,即如果想改動數據的某一小部分,還是需要解壓整個數據或者歸檔整個數據。
4、四大存儲方式之四:SQLite
SQLite:采用SQLite數據庫來存儲數據。SQLite作為一中小型數據庫,應用ios中,跟前三種保存方式相比,相對比較復雜一些。
這里推薦使用第三方框架,FMDB,詳細使用戳這里。
參考資料: