首選項設置存儲ios
NSUserDefaults 以及經過它控制的SettingBundle NSUserDefaults 用來保存一些設置,他會自動寫到什麼時候的位置。
NSUbiquitousKeyValueStore 多平臺同步設置,限制是大小64k,開啓entitlement,惟一Apple ID(還要考慮沒法鏈接到iCloud網絡時的情形)sql
一.文件存儲數據庫
(1)目錄描述
<Application_Home>/AppName.app bundle目錄,包括程序自己。往裏面些東西會致使簽名改變和重啓程序。初始同步後iTunes不備份此目錄。
<Application_Home>/Documents/ 存儲用戶文檔和程序數據。經過文件共享可使其可見。iTunes備份之。
<Application_Home>/Documents/Inbox 其餘程序要求本程序打開的文檔。可讀刪,不可增長修改。要改變能夠先移出來。iTunes備份之。
<Application_Home>/Library/ 非用戶數據文件存儲的根目錄。用其中標準或自定義的文件夾備份不被用戶可見的數據。不該用這個目錄存儲用戶數據。iTunes備份之。
~Library/Application Support/<bundle_ID> 爲用戶建立管理的資源和數據文件。用這個目錄存儲程序狀態信息,下載的文件甚至用戶建立但贊成你管理的數據。自動保存文件。
~/Library/Caches/<bundle_ID> 用來存儲緩存文件或者程序能夠簡單重建的文件的目錄。
<Application_Home>/tmp/ 臨時文件目錄,可能被系統刪除,不該指望始終存在。不被iTunes備份。
另:緩存
(2)離線數據
能夠下載,或從新建立,但用戶但願在離線時也能訪問這些數據。存放在<Application_Home>/Documents 或<Application_Home>/Library/Private Documents ,並標記爲"do not backup"。這兩個位置的數據在低存儲空間時都會保留,而"do not backup"屬性會阻止iTunes或iCloud備份。應用再也不須要離線數據文件時,應該儘快刪除,以免浪費用戶的存儲空間。設置do not back up屬性網絡
- #include <sys/xattr.h>
- - (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
- {
- const char* filePath = [[URL path] fileSystemRepresentation];
- const char* attrName = "com.apple.MobileBackup";
- u_int8_t attrValue = 1;
- int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
- return result == 0;
- }
(3)獲得目錄地址app
URLsForDirectory:inDomains: method 返回NSURL形式的目錄地址
NSSearchPathForDirectoriesInDomains 返回字符串形式的目錄地址
NSHomeDirectory 返回程序根目錄
NSTemporaryDirectory 返回臨時文件目錄ui
(4)相關變量定義編碼
- NSSearchPathDirectory
- enum {
- NSApplicationDirectory = 1,//Supported applications (/Applications)
- NSDemoApplicationDirectory,//Unsupported applications and demonstration versions
- NSDeveloperApplicationDirectory,//Developer applications (/Developer/Applications)
- NSAdminApplicationDirectory,//System and network administration applications
- NSLibraryDirectory,//Various user-visible documentation, support, and configuration files (/Library)
- NSDeveloperDirectory,//Developer resources (/Developer)
- NSUserDirectory,//User home directories (/Users)
- NSDocumentationDirectory,//
- NSDocumentDirectory,//
- NSCoreServiceDirectory,//Location of core services (System/Library/CoreServices)
- NSAutosavedInformationDirectory = 11,//Location of user’s autosaved documents Library/Autosave Information
- NSDesktopDirectory = 12,//
- NSCachesDirectory = 13,//Location of discardable cache files (Library/Caches)
- NSApplicationSupportDirectory = 14,//Location of application support files (Library/Application Support)
- NSDownloadsDirectory = 15,//
- NSInputMethodsDirectory = 16,//
- NSMoviesDirectory = 17,//
- NSMusicDirectory = 18,//
- NSPicturesDirectory = 19,//
- NSPrinterDescriptionDirectory = 20,//
- NSSharedPublicDirectory = 21,//
- NSPreferencePanesDirectory = 22,//
- NSItemReplacementDirectory = 99,//
- NSAllApplicationsDirectory = 100,//
- NSAllLibrariesDirectory = 101//
- };
- typedef NSUInteger NSSearchPathDirectory;
- enum {
- NSUserDomainMask = 1,//用戶主目錄中
- NSLocalDomainMask = 2,//當前機器中
- NSNetworkDomainMask = 4,//網絡中可見的主機
- NSSystemDomainMask = 8,//系統目錄,不可修改(/System)
- NSAllDomainsMask = 0x0ffff,//所有
- };
- typedef NSUInteger NSSearchPathDomainMask;
二.存儲方式url
(1).屬性列表(plist)
array,dictionary,data,string,NSNumber,NSDate 等ns對象直接寫入plist文件中保存.
(2).歸檔文件
實現NSCoding協議(NSCopy也要實現?沒實現也成功了。。)編解碼類說明NSKeyedArchiver建立
- (id)initForWritingWithMutableData:(NSMutableData *)data // 歸檔數據寫到data中
歸檔數據
+ (NSData *)archivedDataWithRootObject:(id)rootObject // 歸檔到data中
+ (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path // 歸檔到文件中
- (void)finishEncoding // 調用後不能繼續歸檔數據,歸檔結束必須調用(公共方法歸檔的不用理這個了)
– outputFormat // data編碼方式,xml仍是二進制
– setOutputFormat:
編碼數據
– encodeBool:forKey:
– encodeBytes:length:forKey:
– encodeConditionalObject:forKey:
– encodeDouble:forKey:
– encodeFloat:forKey:
– encodeInt:forKey:
– encodeInt32:forKey:
– encodeInt64:forKey:
– encodeObject:forKey:
代理委託
– delegate
– setDelegate:代理
- – archiver:didEncodeObject:
- – archiverDidFinish:
- – archiver:willEncodeObject:
- – archiverWillFinish:
- – archiver:willReplaceObject:withObject:
複製代碼
類和類名
+ setClassName:forClass:
+ classNameForClass:
– setClassName:forClass:
– classNameForClass:
異常
extern NSString *NSInvalidArchiveOperationException;NSKeyedUnarchiver建立
– initForReadingWithData:
取消歸檔
+ (id)unarchiveObjectWithData:(NSData *)data // 從data中獲得實現歸檔的對象
+ (id)unarchiveObjectWithFile:(NSString *)path // 從文件中獲得
解碼數據
- (BOOL)containsValueForKey:(NSString *)key // 是否包含給定的key編碼對象
– decodeBoolForKey:
– decodeBytesForKey:returnedLength:
– decodeDoubleForKey:
– decodeFloatForKey:
– decodeIntForKey:
– decodeInt32ForKey:
– decodeInt64ForKey:
– decodeObjectForKey:
- (void)finishDecoding // 通知委託解碼結束,調用後不能再繼續解碼
代理委託
– delegate
– setDelegate:
- – unarchiver:cannotDecodeObjectOfClassName:originalClasses:
- – unarchiver:didDecodeObject:
- – unarchiver:willReplaceObject:withObject:
- Finishing Decoding
- – unarchiverDidFinish:
- – unarchiverWillFinish:
複製代碼
類名
+ setClass:forClassName:
+ classForClassName:
– setClass:forClassName:
– classForClassName:
異常
NSString *NSInvalidUnarchiveOperationException;
(3).CoreData
xcdatamodeld文件中Entity的三種屬性:
Attributes: 對應的Obj-c類的接口變量.
Relationships: Entity之間的關係,to-one,or to-many.
Fetched properties: 對上面Relationship的過濾?參考參考1對應文件存儲形式COREDATA_EXTERN NSString * const NSSQLiteStoreType NS_AVAILABLE(10_4, 3_0);// SQLite形式存儲
COREDATA_EXTERN NSString * const NSXMLStoreType NS_AVAILABLE(10_4, NA);// ios不可用
COREDATA_EXTERN NSString * const NSBinaryStoreType NS_AVAILABLE(10_4, 3_0);// 二進制形式存儲
COREDATA_EXTERN NSString * const NSInMemoryStoreType NS_AVAILABLE(10_4, 3_0);// 內存中基本使用過程(括號中參考sql術語)
NSManagedObjectModel對象 獲取工程中xcdatamodeld文件設置的模版(就是你的數據庫有哪些表,表中有哪些字段的一種說明)
NSPersistentStoreCoordinator對象 根據上面的模版生成或對應的一個文件(數據庫文件,具體的數據文件)
NSManagedObjectContext對象 上面文件的操做的空間,增刪改查都經過這裏進行
NSEntityDescription對象 獲得上面context中的一個表
NSFetchRequest對象 對上面表的一些具體操做,增刪改查
- (NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error; 使用這個方法執行上面的request
若是增刪改了context,記得保存。結束過程示例:
- NSManagedObjectContext *managedObjectContext = nil;
- // 獲得模版
- NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"YOUR_XCDATAMODELD_FILE_NAME" withExtension:@"momd"];
- NSManagedObjectModel* managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
- // 具體文件,DOCUMENT_DICRECTORY應該是nsurl的..
- NSURL *storeURL = [@"DOCUMENT_DICRECTORY" URLByAppendingPathComponent:@"SQLITE.sqlite"];
- NSError *error = nil;
- NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
- // 使用SQLite存儲
- if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
- // 出錯
- }
- else
- {
- // 獲得操做空間
- managedObjectContext = [[NSManagedObjectContext alloc] init];
- [managedObjectContext setPersistentStoreCoordinator:coordinator];
- }
- // 獲得具體的表
- NSEntityDescription *entityDescription = [NSEntityDescription
- entityForName:@"ONE_ENTITY_NAME"
- inManagedObjectContext:managedObjectContext];
- // 操做語句
- NSFetchRequest *request = [[NSFetchRequest alloc] init];
- [request setEntity:entityDescription];
- // 操做語句的條件
- NSPredicate *pred = [NSPredicate predicateWithFormat:@"PREDICATE_SECTION"];
- [request setPredicate:pred];
- NSManagedObject *manageObject = nil;
- // 執行操做,獲得多條具體數據
- NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error];
- if (objects == nil) {
- // 出錯
- }
- if ([objects count] > 0)
- // 多條,取第一條
- manageObject = [objects objectAtIndex:0];
- else
- // 沒有相應的,就建立
- manageObject = [NSEntityDescription
- insertNewObjectForEntityForName:@"TABLE_NAME"
- inManagedObjectContext:managedObjectContext];
- // 改變她的一個字段的值
- [manageObject setValue:@"VALUE" forKey:@"ONE_FIELD_NAME_OF_THE_TABLE"];
- [request release];
- // 保存,結束
- [managedObjectContext save:&error];
複製代碼
(四).SQLite
引入SQLite庫,加入頭文件,使用C API操做.繁瑣的地方在於只能存儲c數據格式,須要來回轉換.過程示例:
- // 聲明數據庫
- sqlite3 *database;
- // 打開
- if (sqlite3_open("數據庫文件路徑", &database) != SQLITE_OK) {
- sqlite3_close(database);
- // 出錯
- }
- char *errorMsg;
- // 執行無返回語句
- if (sqlite3_exec (database, "增刪改創語句",NULL, NULL, &errorMsg) != SQLITE_OK) {
- sqlite3_close(database);
- // 出錯
- }
- sqlite3_stmt *statement;
- // 執行查詢語句
- if (sqlite3_prepare_v2(database, "查詢語句",-1, &statement, nil) == SQLITE_OK) {
- // 遍歷結果
- while (sqlite3_step(statement) == SQLITE_ROW) {
- int row = sqlite3_column_int(statement, 0);
- // 第一列數據
- char *rowData = (char *)sqlite3_column_text(statement, 1);
- }
- // 結束遍歷
- sqlite3_finalize(statement);
- }
- // 關閉數據庫
- sqlite3_close(database);