天天看點

IOS本地存儲本地存儲

本地存儲

IOS 沙盒

:每⼀個App都有⼀個存儲空間。iOS系統為每個應⽤程式建立⾃⼰的⽬錄,每個應⽤程式隻能通路⾃⼰的⽬錄,不能互相通。

目錄結構如下所示:

  • Documents: 儲存應⽤運⾏時⽣成的需要持久化的資料,iTunes會⾃動備份該⽬錄。蘋果建議将在應⽤程式中浏覽到的⽂件資料儲存在該⽬錄下。
  • Library:
  • Caches:⼀般存儲的是緩存⽂件,例如圖⽚視訊等,此⽬錄下的⽂件不會再應⽤程式退出時删除。在⼿機備份的時候,iTunes不會備份該⽬錄。例如⾳頻,視訊等⽂件存放其中
  • Preferences:儲存應⽤程式的所有偏好設定iOS的Settings(設定),我們不應該直接在這建立⽂件,⽽是需要通過NSUserDefault這個類來通路應⽤程式的偏好設定。iTunes會⾃動備份該⽂件⽬錄下的内容。⽐如說:是否允許通路圖⽚,是否允許通路地理位置…
  • tmp:臨時⽂件⽬錄,在程式重新運⾏的時候,和開機的時候,會清空tmp⽂件夾。

擷取目錄的代碼

- (void)viewDidLoad {
    [super viewDidLoad];

    // 擷取document目錄
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains
        (NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [documentPaths objectAtIndex:0];

    // 擷取Cache目錄
    NSArray *cachePaths = NSSearchPathForDirectoriesInDomains
        (NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachePath = [cachePaths objectAtIndex:0];

    // 擷取Library目錄
    NSArray *libraryPaths = NSSearchPathForDirectoriesInDomains
        (NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *libraryPath = [libraryPaths objectAtIndex:0];

    // 擷取Tmp目錄
    NSString *tmpPath = NSTemporaryDirectory();

    _label.text = [NSString stringWithFormat:@"Document: %@\nCache: %@\nLibrary: %@\nTmp: %@", documentPath, cachePath, libraryPath, tmpPath];
}
           

檔案操作

檔案操作這裡要用到

NSFileManager

這個類

首先要建立fileManager對象,并且判斷檔案是否存在

// 判斷檔案是否存在
NSFileManager *fileManager = [NSFileManager defaultManager];

NSString *document = NSSearchPathForDirectoriesInDomains
    (NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

NSString *filePath = [document stringByAppendingPathComponent:@"test.txt"];

if ([fileManager fileExistsAtPath:filePath]) {
    NSLog(@"test.txt exists");
}

BOOL isDirectory;
if ([fileManager fileExistsAtPath:filePath isDirectory:&isDirectory]) {

}
           

建立目錄

// 建立目錄
NSString *testDir = [document stringByAppendingPathComponent:@"test"];
// 存放建立失敗的錯誤,友善後面來進行判斷操作
NSError *error;

[fileManager createDirectoryAtPath:testDir withIntermediateDirectories:YES attributes:nil error:&error];

           

建立檔案

// 建立檔案
NSString *testTxt = [testDir stringByAppendingPathComponent:@"test.txt"];
NSData *data = [@"Hello world!" dataUsingEncoding:NSUTF8StringEncoding];
[fileManager createFileAtPath:testTxt contents:data attributes:nil];

           

删除檔案

// 删除檔案
[fileManager removeItemAtPath:testTxt error:nil];
           

檔案讀寫

寫檔案

- (IBAction)write:(id)sender {
    // 檔案父目錄
    NSString *document = NSSearchPathForDirectoriesInDomains
        (NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
	// 檔案目錄
    NSString *filePath = [document stringByAppendingPathComponent:@"text.txt"];
	// 寫入的内容
    NSString *contents = @"Hello world!";
    // 調用writeToFile
    [contents writeToFile:filePath atomically:YES 
     encoding:NSUTF8StringEncoding error:nil];
}
           

讀檔案

- (IBAction)read:(id)sender {
    // 檔案父目錄
    NSString *document = NSSearchPathForDirectoriesInDomains
        (NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
	// 檔案目錄
    NSString *filePath = [document 
                          stringByAppendingPathComponent:@"text.txt"];
	// 将檔案内容讀入字元串
    NSString *content = [NSString stringWithContentsOfFile:filePath 
                         encoding:NSUTF8StringEncoding error:nil];
    
    NSLog(@"content %@", content);
}
           

NSUserDefaults

  • NSUserDefaults⽤來存儲 ⽤戶設定 系統配置等⼀些⼩的資料。
    • 因為資料是明⽂存儲在 plist ⽂件中,不安全,即使隻是修改⼀個 key 都會 load 整個⽂件,資料多加載慢(IO 記憶體),不适合存儲⼤量資料。
    • 它是單例的,也是線程安全的,是以鍵值對 key-value 的形式儲存在沙盒中
    • 存儲路徑為:沙盒路徑的Library——>Preferences⽂件夾中
  • ⽀持的資料類型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、

    NSInteger、NSFloat等系統定義的資料類型,如果要存放其他資料類型或者⾃定義的對象

    (如⾃定義的類對象),則必須将其轉換成NSData存儲。

    • 即使對象是NSArray或NSDictionary,他們存儲的類型也應該是以上範圍包括的

讀取代碼

// read
NSInteger x = [[NSUserDefaults standardUserDefaults] 
               integerForKey:@"x"];
NSString *name = [[NSUserDefaults standardUserDefaults] 
                  stringForKey:@"name"];
NSDictionary *dict = [[NSUserDefaults standardUserDefaults] 
                      objectForKey:@"button"];
data = [[NSUserDefaults standardUserDefaults] dataForKey:@"user"];
user = [NSKeyedUnarchiver unarchivedObjectOfClass:[User class] 
        fromData:data error:nil];
           

寫入代碼

// save
[[NSUserDefaults standardUserDefaults] setInteger:1024 forKey:@"x"];
[[NSUserDefaults standardUserDefaults] setObject:@"Tom" forKey:@"name"];
[[NSUserDefaults standardUserDefaults] setObject:@{
    @"text": @"Cancel",
    @"color": @"#ff0000",
} forKey:@"button"];

User *user = [[User alloc] init];
user.userId = 123;
user.nickname = @"Tom";
user.isVip = YES;

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:user requiringSecureCoding:YES error:nil];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"user"];
           

繼續閱讀