IOS數據持久化學習筆記

iOS有一套完整的數據安全體系,iOS應用程序只能訪問本身的目錄,這個目錄稱爲沙箱目錄,而應用程序間禁止數據的共享。訪問一些特定的應用時,如聯繫人應用,必須經過特定的API訪問。ios

沙箱目錄

沙箱目錄是一種數據安全策略,不少系統都採用沙箱設計,實現HTML5規範的一些瀏覽器也採用沙箱設計,沙箱目錄設計的原理就是隻容許本身的應用訪問目錄,而不容許其它的應用訪問。沙箱目錄有3個子目錄,分別爲Documents,Library,tmp。數據庫

獲取沙箱目錄的主目錄:macos

NSString *path = NSHomeDirectory();
NSLog(@"path : %@", path);
複製代碼

Documents目錄:該目錄用於存儲很是大的文件或須要很是頻繁更新的數據,可以進行iTunes或iCloud備份。編程

獲取Documents目錄位置:api

NSArray *documentArray = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [documentArray lastObject];
NSLog(@"%@",documentsPath);
複製代碼

Library目錄:在Library目錄目錄下面有Preferences和Caches目錄,其中Preferences用於存放應用程序的設置數據,Caches能夠用來存放應用程序的數據,用來存儲緩存文件。數組

獲取Library目錄位置:瀏覽器

NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSLog(@"path : %@", pathArray.lastObject);
複製代碼

tem目錄:臨時文件目錄,用戶能夠訪問它,它不可以進行iTunes或iCloud備份。緩存

獲取tem目錄位置:安全

NSString *temPath = NSTemporaryDirectory();
複製代碼

NSuserDefault

NSUserDefaults是一個分層的持久化進程間(可選的分佈式)鍵值存儲,爲存儲用戶設置而優化。定義的是一個用戶默認數據庫的接口。bash

NSUserDefaults是一個單例,每一個應用都有一個(也只有一個)NSUserDefaults對象。向NSUserDefaults類發送standardUserDefaults消息能夠獲得該對象。

使用NSUserDefaults對象讀取信息時,NSUserDefaults會緩存信息,設置信息時,它將在當前進程中同步更改,並異步更改成持久存儲和其餘進程。存儲在NSUserDefaults中的本地數據在應用程序從新啓動時保持不變。

對於存儲在其中的任何鍵,均可以使用鍵值觀察來觀察NSUserDefaults,當NSUserDefaults 實例所存儲的數據變動時,系統會發送 NSUserDefaultsDidChangeNotification 的通知,通知會返回當前更改的 NSUserDefaults 實例對象回來。

NSUserDefaults支持的數據類型

NSUserDefaults適合存儲輕量級的常常查詢並偶爾修改的本地數據,使用的Key必須是NSString對象,一個鍵對應一項設置(preference)。存取的對象必須是對象或者基本類型的數值。若是是對象,則必須是可序列化的(serializable)對象。支持的數據類型有:NSNumber,NSString,NSDate,NSArray,NSDictionary,BOOL。注意:NSUserDefaults 存儲的對象全是不可變的。

NSUserDefaults文件的存儲路徑

存儲文件的沙盒路徑爲: Library/Preferences

存儲文件的格式爲: .plist

例如 :

截屏2020-06-17下午11.24.55.png

NSUserDefaults的域

UserDefaults數據庫中實際上是由多個層級的域組成的,當讀取一個鍵值的數據時,NSUserDefaults從上到下透過域的層級尋找正確的值,不一樣的域有不一樣的功能,有些域是可持久的,有些域則不行。默認包含五個Domain,以下:

  • 一、參數域( argument domain)有最高優先權。
  • 二、應用域(application domain)是最重要的域,它存儲着你app經過NSUserDefaults set...forKey添加的設置。
  • 三、全局域(global domain)則存儲着系統的設置。
  • 四、語言域(language-specific domains)則包括地區、日期等。
  • 五、註冊域(registration domain)僅有較低的優先權,只有在應用域沒有找到值時才從註冊域去尋找。

例如:當某個界面是第一次運行時,這時的key值(鍵)所對應的值還不存在,因此NSUserDefaults對象會使用默認值爲0。可是對於某些設置,可能須要臨時的、非0的默認值(如"出廠設置"),不然應用將沒法正確的運行。通常默認值都是存放於註冊域中。默認狀況下,應用域是空的,沒有鍵也沒有值。當用戶第一次修改某個設置時,相應的值會經過指定的鍵加入應用域。當經過NSUserDefaults對象獲取某個設置的值時,該對象先會在應用域查找,若是沒有,NSUserDefaults則會在註冊域中查找並返回默認值。查詢順序:參數域 -> 應用域 -> 全局域 -> 語言域 ->註冊域。

NSUserDefaults的優缺點

優勢:

  • 不須要關心文件名。
  • 快速進行鍵值對存儲。
  • 直接存儲基本數據類型。

缺點:

  • 不能存儲自定義數據。
  • 取出的數據都是不可變的。

NSuserDefault提供的經常使用屬性與函數

@property (class, readonly, strong) NSUserDefaults *standardUserDefaults;

屬性描述 : 返回NSUserDefaults的全局實例。

@property (class, readonly, strong) NSUserDefaults *standardUserDefaults;
複製代碼

- (void)setObject:(nullable id)value forKey:(NSString *)defaultName;

函數描述 : 當即在搜索列表項中存儲所提供Key的值(若是傳遞的值爲nil,則刪除該值),而後在其餘進程可使用該值的狀況下異步持久存儲該值。

參數 :

value : 要存儲在默認數據庫中的對象。

defaultName : 與值關聯的鍵。

- (void)setObject:(nullable id)value forKey:(NSString *)defaultName;
複製代碼

- (BOOL)synchronize;

函數描述 : 等待對默認數據庫的任何掛起的異步更新並返回(等待數據持久持久存儲),此函數不推薦使用。

返回值 : 若是數據成功保存到磁盤,則爲YES,不然爲NO。

- (BOOL)synchronize;
複製代碼

例如存儲數據:

[[NSUserDefaults standardUserDefaults] setObject:@"好高興啊" forKey:@"又吃成長快樂了"];
[[NSUserDefaults standardUserDefaults] synchronize];
複製代碼

- (nullable id)objectForKey:(NSString *)defaultName;

函數描述 : 返回與指定鍵關聯的對象。此方法按域的列出順序搜索包含在搜索列表中的域,並返回與指定默認值的第一個匹配項關聯的對象。

參數 :

defaultName : 當前用戶默認數據庫中的Key。

返回值 : 與指定鍵關聯的對象,若是找不到鍵,則爲nil。

- (nullable id)objectForKey:(NSString *)defaultName;
複製代碼

例如取出數據:

NSString *Study = [NSUserDefaults standardUserDefaults] objectForKey:@"又吃成長快樂了"];
複製代碼

- (void)removeObjectForKey:(NSString *)defaultName;

函數描述:刪除指定默認Key的值。若是在搜索列表中位於標準應用程序域以前的域中存在相同的Key,則刪除默認值不會影響objectForKey:方法返回的值。

參數 :

defaultName : 要移除其值的Key。

- (void)removeObjectForKey:(NSString *)defaultName;
複製代碼

- (nullable NSString *)stringForKey:(NSString *)defaultName;

函數描述 : 返回與指定Key關聯的字符串。返回的字符串是不可變的,即便最初設置的值是可變的字符串。

參數 :

defaultName : 當前用戶默認數據庫中的Key。

返回值 : 對於字符串值,與指定Key關聯的字符串;對於數字值,爲數字的字符串值。若是默認值不存在或不是字符串或數值,則返回nil。

- (nullable NSString *)stringForKey:(NSString *)defaultName;
複製代碼

- (nullable NSArray *)arrayForKey:(NSString *)defaultName;

函數描述 : 返回與指定Key關聯的數組。返回的數組及其內容是不可變的,即便最初設置的值是可變的。

參數 :

defaultName : 當前用戶默認數據庫中的Key。

返回值 : 與指定Key關聯的數組,若是Key不存在或其值不是數組,則爲nil。

- (nullable NSArray *)arrayForKey:(NSString *)defaultName;
複製代碼

- (nullable NSDictionary<NSString *, id> *)dictionaryForKey:(NSString *)defaultName;

函數描述 : 返回與指定Key關聯的字典對象。返回的字典及其內容是不可變的,即便最初設置的值是可變的。

參數 :

defaultName : 當前用戶默認數據庫中的Key。

返回值 : 與指定鍵關聯的NSDictionary對象,若是鍵不存在或其值不是NSDictionary,則爲nil。

- (nullable NSDictionary<NSString *, id> *)dictionaryForKey:(NSString *)defaultName;
複製代碼

- (nullable NSData *)dataForKey:(NSString *)defaultName;

函數描述 : 返回與指定Key關聯的數據對象。返回的數據對象是不可變的,即便最初設置的值是可變的數據對象。

參數 :

defaultName : 當前用戶默認數據庫中的Key。

返回值 : 與指定鍵關聯的NSData對象,若是鍵不存在或其值不是NSData對象,則爲nil。

- (nullable NSData *)dataForKey:(NSString *)defaultName;
複製代碼

- (nullable NSArray<NSString *> *)stringArrayForKey:(NSString *)defaultName;

函數描述 : 返回與指定Key關聯的字符串數組。返回的數組及其內容是不可變的,即便最初設置的值是可變的。

參數 :

defaultName : 當前用戶默認數據庫中的Key。

返回值 :字符串對象數組,若是指定的默認值不存在、默認值不包含數組或數組不包含字符串,則爲nil。

- (nullable NSArray<NSString *> *)stringArrayForKey:(NSString *)defaultName;
複製代碼

- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;

函數描述 : 將指定的默認Key的值設置爲指定的整數值。這是一個調用setObject:forKey:的方便方法。

參數 :

value : 要存儲在默認數據庫中的整數值。

defaultName : 與值關聯的Key。

- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
複製代碼

- (NSInteger)integerForKey:(NSString *)defaultName;

函數描述 : 返回與指定Key關聯的整數值。此方法自動將某些值強制轉換爲等效的整數值(若是能夠肯定轉換的話)。布爾值YES變爲1,NO變爲0。浮點數變爲小於該數的最大整數(例如,2.67變爲2)。表示整數的字符串變爲等效整數(例如「123」變爲123)。

參數 :

defaultName : 當前用戶默認數據庫中的Key。

返回值 : 與指定Key關聯的整數值。若是指定的Key不存在,則此方法返回0。

- (NSInteger)integerForKey:(NSString *)defaultName;
複製代碼

- (void)setFloat:(float)value forKey:(NSString *)defaultName;

函數描述 : 將指定默認Key的值設置爲指定的浮點值。這是一個調用setObject:forKey:的方便方法。

參數 :

value : 要存儲在默認數據庫中的浮點值。

defaultName : 與值關聯的Key。

- (void)setFloat:(float)value forKey:(NSString *)defaultName;
複製代碼

- (float)floatForKey:(NSString *)defaultName;

函數描述 : 返回與指定Key關聯的浮點值。此方法自動將某些值強制轉換爲等效的浮點值(若是能夠肯定轉換的話)。布爾值YES變爲1.0,NO變爲0.0。整數變爲等效的浮點(例如,2變爲2.0)。表示浮點數的字符串變爲等效浮點數(例如,「123.4」變爲123.4)。

參數 :

defaultName : 當前用戶默認數據庫中的Key。

返回值 : 與指定Key關聯的浮點值。若是Key不存在,則此方法返回0。

- (float)floatForKey:(NSString *)defaultName;
複製代碼

- (void)setDouble:(double)value forKey:(NSString *)defaultName;

函數描述 : 將指定的默認Key的值設置爲雙精度浮點值。這是一個調用setObject:forKey:的方便方法。

參數 :

value : 要存儲在默認數據庫中的雙精度浮點值。

defaultName :與值關聯的Key。

- (void)setDouble:(double)value forKey:(NSString *)defaultName;
複製代碼

- (double)doubleForKey:(NSString *)defaultName;

函數描述 : 返回與指定鍵關聯的雙精度浮點值。此方法自動將某些值強制轉換爲等效的雙精度值(若是能夠肯定)。布爾值YES變爲1.000000,NO變爲0.000000。整數變爲等效的雙精度數(例如,2變爲2.000000)。表示浮點數的字符串變爲等效的雙精度(例如,「123.40000000000001」變爲123.40000000000001)。

參數 :

defaultName : 當前用戶默認數據庫中的Key。

返回值 : 與指定Key關聯的雙精度浮點值。若是Key不存在,則此方法返回0。

- (double)doubleForKey:(NSString *)defaultName;
複製代碼

- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;

函數描述 : 將指定的默認Key的值設置爲指定的布爾值。這是一個調用setObject:forKey:的方便方法。

參數 :

value : 要存儲在默認數據庫中的布爾值。

defaultName : 與值關聯的Key。

- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
複製代碼

- (BOOL)boolForKey:(NSString *)defaultName;

函數描述 : 返回與指定Key關聯的布爾值。此方法自動將某些「truthy」值(如字符串「true」、「YES」和「1」、數字1和1.0)強制爲布爾值YES。對於某些「falsy」值也是如此,例如字符串「false」、「NO」和「0」,以及數字0和0.0,它們自動強制爲布爾值NO。

參數 :

defaultName : 當前用戶默認數據庫中的Key。

返回值 : 與指定Key關聯的布爾值。若是指定的Key不存在,則此方法返回「否」。

- (BOOL)boolForKey:(NSString *)defaultName;
複製代碼

- (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));

函數描述 : 將指定的默認Key的值設置爲指定的URL。若是url是文件url,則此方法採用絕對url,肯定其路徑是否能夠相對於用戶的主目錄建立,若是能夠,則使用stringByAbbreviatingWithTildeInPath方法對其進行縮寫。若是url不是文件url,則經過調用archivedDataWithRootObject:方法並將url做爲根對象傳遞來建立數據對象。

參數 :

url : 要存儲在默認數據庫中的URL。

defaultName : 與值關聯的Key。

- (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
複製代碼

- (void)registerDefaults:(NSDictionary<NSString *, id> *)registrationDictionary;

函數描述 : 將指定字典的內容添加到註冊域。若是沒有註冊域,則使用指定的詞典建立一個註冊域,並將NSRegistrationDomain添加到搜索列表的末尾。註冊域的內容不會寫入磁盤;每次啓動應用程序時都須要調用此方法。能夠將plist文件放在應用程序的Resources目錄中,並使用從該文件讀取的內容調用registerDefaults:方法。

參數 :

dictionary : 要註冊的鍵和值的字典。

- (void)registerDefaults:(NSDictionary<NSString *, id> *)registrationDictionary;
複製代碼

- (void)addSuiteNamed:(NSString *)suiteName;

函數描述 : 將指定域名插入到接收方的搜索列表中。suiteName域相似於bundle標識符字符串,但不必定綁定到特定的應用程序或bundle。一個套件能夠用來保存在多個應用程序之間共享的首選項。 suiteName域的附加搜索列表在當前域以後但在全局默認值以前搜索(即,當添加套件時,首選項子系統首先搜索應用程序的用戶首選項,而後再次搜索,就好像它是一個bundle標識符等於suiteName的應用程序同樣,最後搜索全局首選項)。不支持傳遞NSGlobalDomain或當前應用程序的束標識符。

參數 :

suiteName : 要插入的域名。

- (void)addSuiteNamed:(NSString *)suiteName;
複製代碼

- (void)removeSuiteNamed:(NSString *)suiteName;

函數描述 : 從接收器的搜索列表中刪除指定的域名。

參數 :

suiteName : 要刪除的域名。

- (void)removeSuiteNamed:(NSString *)suiteName;
複製代碼

- (NSDictionary<NSString *, id> *)dictionaryRepresentation;

函數描述 : 返回一個字典,其中包含搜索列表中域中全部鍵值對的並集。與objectForKey:同樣,搜索列表中較早的域中的鍵值對具備優先權。合併的結果不會保留每一個條目來自哪一個域的信息。

返回值 : 包含鍵值的字典。這些鍵是默認值的名稱,每一個鍵對應的值是一個屬性列表對象(NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary)。

- (NSDictionary<NSString *, id> *)dictionaryRepresentation;
複製代碼

@property (readonly, copy) NSArray<NSString *> *volatileDomainNames;

屬性描述 : 當前易失性的域名。域名用字符串表示。經過將返回的域名傳遞給volatileDomainForName:方法,能夠獲取每一個域的內容。

@property (readonly, copy) NSArray<NSString *> *volatileDomainNames;
複製代碼

- (NSDictionary<NSString *, id> *)volatileDomainForName:(NSString *)domainName;

函數描述 : 返回指定易失性域的字典。

參數 :

domainName : 須要其Key和值的域。

返回值 : 屬於域的Key和值的字典。字典中的鍵是默認值的名稱,每一個Key對應的值是一個屬性列表對象(NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary)。

- (NSDictionary<NSString *, id> *)volatileDomainForName:(NSString *)domainName;
複製代碼

- (void)setVolatileDomain:(NSDictionary<NSString *, id> *)domain forName:(NSString *)domainName;

函數描述 : 爲指定的易失性域設置字典。若是已存在具備指定名稱的易失性域,則此方法引起NSInvalidArgumentException。

參數 :

domain : 要分配給域的Key和值的字典。

domainName : 要設置其字典的域。

- (void)setVolatileDomain:(NSDictionary<NSString *, id> *)domain forName:(NSString *)domainName;
複製代碼

- (void)removeVolatileDomainForName:(NSString *)domainName;

函數描述 : 從用戶的默認值中刪除指定的易失性域。

參數 :

domainName : 要刪除的易失性域。

- (void)removeVolatileDomainForName:(NSString *)domainName;
複製代碼

- (NSArray *)persistentDomainNames API_DEPRECATED("Not recommended", macos(10.0,10.9), ios(2.0,7.0), watchos(2.0,2.0), tvos(9.0,9.0));

函數描述 : 返回當前持久域名的數組(不推薦使用)。經過將返回的域名傳遞給persistentDomainForName:方法,能夠獲取每一個域的Key和值。

返回值 : 包含域名的NSString對象數組。

- (NSArray *)persistentDomainNames API_DEPRECATED("Not recommended", macos(10.0,10.9), ios(2.0,7.0), watchos(2.0,2.0), tvos(9.0,9.0));
複製代碼

- (nullable NSDictionary<NSString *, id> *)persistentDomainForName:(NSString *)domainName;

函數描述 : 返回指定域的默認值的字典表示形式。調用此方法至關於使用initWithSuiteName初始化用戶默認值對象:傳遞domainName並對其調用dictionaryRepresentation方法。

參數 :

domainName : 要表示的域的名稱。

返回值 : 包含每一個默認名稱對應默認值的及其Key的字典。

- (nullable NSDictionary<NSString *, id> *)persistentDomainForName:(NSString *)domainName;
複製代碼

- (void)setPersistentDomain:(NSDictionary<NSString *, id> *)domain forName:(NSString *)domainName;

函數描述 : 爲指定的持久域設置字典。調用此方法至關於使用initWithSuiteName初始化用戶默認值對象:傳遞domainName,並對域中每一個鍵值對調用setObject:forKey:的方法。

參數 :

domain : 要分配給域的Key和值的字典。

domainName : 要設置其內容的域的名稱。

- (void)setPersistentDomain:(NSDictionary<NSString *, id> *)domain forName:(NSString *)domainName;
複製代碼

- (void)removePersistentDomainForName:(NSString *)domainName;

函數描述 : 從用戶的默認值中刪除指定持久域的內容。調用此方法至關於使用initWithSuiteName:傳遞domainName初始化用戶默認對象,並對其每一個鍵調用removeObjectForKey:方法。更改永久性域時,將發佈NSUserDefaultsDidChangeNotification通知。

參數 :

domainName : 要刪除其內容的域的名稱。

- (void)removePersistentDomainForName:(NSString *)domainName;
複製代碼

- (BOOL)objectIsForcedForKey:(NSString *)key;

函數描述 : 返回一個布爾值,指示指定的Key是否由管理員管理。此方法假定Key是與當前用戶和應用程序關聯的首選項。對於託管Key,應用程序應禁用容許用戶修改Key的值的任何用戶界面。

參數 :

key : 要檢查其狀態的Key。

返回值 :若是指定密鑰的值由管理員管理,則爲「YES」,不然爲「NO」。

- (BOOL)objectIsForcedForKey:(NSString *)key;
複製代碼

- (BOOL)objectIsForcedForKey:(NSString *)key inDomain:(NSString *)domain;

函數描述 : 返回一個布爾值,指示指定域中的Key是否由管理員管理。此方法假定Key是與當前用戶關聯的首選項。對於託管Key,應用程序應禁用容許用戶修改密Key的值的任何用戶界面。

參數 :

key : 要檢查其狀態的Key。

domain : Key的域。

返回值 : 若是Key由指定域中的管理員管理,則爲「YES」,不然爲「NO」。

- (BOOL)objectIsForcedForKey:(NSString *)key inDomain:(NSString *)domain;
複製代碼

NSUserDefaults的初始化函數

- (nullable instancetype)initWithSuiteName:(nullable NSString *)suitename API_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0)) NS_DESIGNATED_INITIALIZER;

函數描述 : 使用指定域標識符的默認值建立初始化的NSUserDefaults對象。在開發應用程序套件時,可使用此方法在應用程序之間共享首選項或其餘數據,或者在開發應用程序擴展時,在擴展程序與其包含的應用程序之間共享首選項或其餘數據。參數和註冊域在NSUserDefaults的全部實例之間共享。

suiteName參數匹配相應CFPreferences api的域參數(在Foundation和Core Foundation常量之間轉換時除外)。例如 :

id userDefaultsValue = [[[NSUserDefaults alloc] initWithSuiteName:@"someDomain"] objectForKey:@"someKey"];
id preferencesValue = CFPreferencesCopyAppValue(@"someKey", @"someDomain");
//userDefaultsValue和preferencesValue相等
複製代碼

參數 :

suitename : 搜索列表的域標識符。若是將nil傳遞給這個參數,系統將使用standardUserDefaults類方法使用的默認搜索列表。由於套件管理指定應用程序組的默認值,因此套件名稱必須與應用程序的主bundle identifier不一樣。NSGlobalDomain也是一個無效的套件名稱,由於它不可由應用程序寫入。

返回值 : 使用指定域標識符的默認值建立初始化的NSUserDefaults對象。

- (nullable instancetype)initWithSuiteName:(nullable NSString *)suitename API_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0)) NS_DESIGNATED_INITIALIZER;
複製代碼

- (nullable id)initWithUser:(NSString *)username API_DEPRECATED("Use -init instead", macos(10.0,10.9), ios(2.0,7.0), watchos(2.0,2.0), tvos(9.0,9.0));

函數描述 : 建立用指定用戶賬戶的默認值初始化的NSUserDefaults對象。此方法不會在搜索列表中放入任何內容。只有在分配了本身的NSUserDefaults實例而不是使用共享實例時才調用它。一般不使用此方法初始化NSUserDefaults的實例。超級用戶使用的應用程序可使用此方法更新許多用戶的默認數據庫。啓動應用程序的用戶必須對新用戶的默認數據庫具備適當的訪問權限(讀、寫或同時訪問),不然此方法將返回nil。

參數 :

username : 用戶賬戶的名稱。

返回值 : 已初始化的NSUserDefaults對象,其參數和註冊域已設置。若是當前用戶無權訪問指定的用戶賬戶,則此方法返回nil。

- (nullable id)initWithUser:(NSString *)username API_DEPRECATED("Use -init instead", macos(10.0,10.9), ios(2.0,7.0), watchos(2.0,2.0), tvos(9.0,9.0));
複製代碼

域的常量

FOUNDATION_EXPORT NSString * const NSGlobalDomain;

常量描述 : 由全部應用程序所看到的默認值組成的域(全局域)。

FOUNDATION_EXPORT NSString * const NSGlobalDomain;
複製代碼

FOUNDATION_EXPORT NSString * const NSArgumentDomain;

常量描述 : 從應用程序的參數解析默認值組成的域(參數域)。

FOUNDATION_EXPORT NSString * const NSArgumentDomain;
複製代碼

FOUNDATION_EXPORT NSString * const NSRegistrationDomain;

常量描述 : 由一組臨時缺省值組成的域,其值能夠由應用程序設置,以確保搜索始終是成功的(註冊域)。

FOUNDATION_EXPORT NSString * const NSRegistrationDomain;
複製代碼

NSUserDefaults通知

FOUNDATION_EXPORT NSNotificationName const NSUserDefaultsSizeLimitExceededNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macOS);

通知描述 : 當用戶默認數據中存儲更多數據時發送。

FOUNDATION_EXPORT NSNotificationName const NSUserDefaultsSizeLimitExceededNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
複製代碼

FOUNDATION_EXPORT NSNotificationName const NSUbiquitousUserDefaultsNoCloudAccountNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macOS);

通知描述 : 當設置了雲默認時,但沒有登陸iCloud用戶發送。

FOUNDATION_EXPORT NSNotificationName const NSUbiquitousUserDefaultsNoCloudAccountNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
複製代碼

FOUNDATION_EXPORT NSNotificationName const NSUbiquitousUserDefaultsDidChangeAccountsNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macOS);

通知描述 : 當用戶更改主iCloud賬戶時發送。

FOUNDATION_EXPORT NSNotificationName const NSUbiquitousUserDefaultsDidChangeAccountsNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
複製代碼

FOUNDATION_EXPORT NSNotificationName const NSUbiquitousUserDefaultsCompletedInitialSyncNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macOS);

函數描述 : 發佈時,默認完成下載數據,不管是第一次設備鏈接到一個iCloud賬戶,或當用戶切換他們的主要iCloud賬戶發送。

FOUNDATION_EXPORT NSNotificationName const NSUbiquitousUserDefaultsCompletedInitialSyncNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
複製代碼

FOUNDATION_EXPORT NSNotificationName const NSUserDefaultsDidChangeNotification;

函數描述 : 在當前進程中更改用戶默認值時發送

FOUNDATION_EXPORT NSNotificationName const NSUserDefaultsDidChangeNotification;
複製代碼

對象歸檔

對象歸檔是一種序列化方式,爲了便於數據傳輸,先將歸檔對象序列化一個文件,而後再經過反歸檔將數據恢復到對象中。歸檔技術能夠實現數據的持久化,不過在大量數據和頻繁讀寫的狀況下,它就不太合適了。

對一個對象進行完整歸檔須要知足的條件爲該對象的類必須實現NSCoding協議,並且每一個成員變量都應該基本數據類型或都是實現NSCoding協議的某個類的實例。

歸檔類NSKeyedArchiver和反歸檔類NSKeyedUnArchiver老是與NSData關聯在一塊兒。NSData封裝了字節數據的緩存類,提供了讀取數據文件的方法,具體以下:

+ (nullable instancetype)dataWithContentsOfFile:(NSString *)path;它是靜態工廠方法,用於從文件讀取數據來建立NSData對象。

+ (nullable instancetype)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;它是靜態工廠方法,用於從文件讀取數據建立NSData對象,options參數是指定讀取數據選項,error返回讀取數據的錯誤。

- (nullable instancetype)initWithContentsOfFile:(NSString *)path;它是實例構造函數,用於從文件讀取數據來建立NSData對象。

- (nullable instancetype)initWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;它是實例構造函數,用於從文件讀取數據建立NSData對象,options參數是指定讀取數據選項,error返回讀取數據的錯誤。

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;將NSData對象寫入文件,atomically參數是否寫入輔助文件,false時數據直接寫入目標文件路徑,true數據寫入輔助文件,寫入成功後將輔助文件路徑改成目標文件路徑。當目標文件已經存在時,atomically設置爲true,能夠防止系統崩潰致使舊的文件破壞。

- (BOOL)writeToFile:(NSString *)path options:(NSDataWritingOptions)writeOptionsMask error:(NSError **)errorPtr;經過提供寫入選項將NSData對象寫入文件,options參數是指定寫入數據選項,error參數是返回寫入數據的錯誤。

歸檔過程是使用NSKeyedArchiver對象歸檔數據,具體過程爲先將歸檔數據寫入NSData對象,而後將NAData對象寫入歸檔文件。反歸檔過程是從歸檔文件中讀取數據到NSData對象,再利用NSKeyedUnArchiver對象從NSData對象中反歸檔出數據。

SQLite數據庫

2000年,D.裏查德.希普開發併發布了嵌入式系統使用的關係數據庫SQlite,目前的主流版本是SQLite3。SQLite是開源的,它採用C語言編寫,具備可移植性強,可靠性高,小而易用的特色。SQLite運行時與使用它的應用程序之間共用相同的進程空間,而不是單獨的兩個進程。SQLite提供了對SQL-92標準的支持,支持多表、索引、事務、視圖和觸發。SQLite是無數據類型的數據庫,字段不用指定類型。

雖然SQLite能夠忽略數據類型,但從編程規範上講,咱們仍是應該在Create Table語句中指定數據類型。由於數據類型能夠代表這個字段的含義,便於閱讀和理解代碼。

SQlite支持的常見數據類型有:

  • INTEGER —— 有符號的整數類型。
  • REAL —— 浮點類型。
  • TEXT —— 字符串類型,採用UTF-8或UTF-16字符編碼。
  • BLOB —— 二進制大對象類型,可以存聽任何二進制數據。

SQLite中沒有BOOLEAN類型,能夠採用整數0和1代替。SQLite中也沒有時間和日期類型,它們存儲在TEXT、REAL和INTEGER類型中。爲了兼容SQL-92標準中的其餘數據類型,咱們能夠將它們轉換成上述幾種類型:

  • 將VARCHAR、CHAR和CLOB轉換爲TEXT類型。
  • 將FLOAT、DOUBLE轉換爲REAL類型。
  • 將NUMERIC轉換爲INTEGER或REAL類型。
相關文章
相關標籤/搜索