ios開發 數據存儲

首選項設置存儲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屬性
網絡

  1. #include <sys/xattr.h>
  2. - (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
  3. {
  4.     const char* filePath = [[URL path] fileSystemRepresentation];
  5.     const char* attrName = "com.apple.MobileBackup";
  6.     u_int8_t attrValue = 1;
  7.     int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
  8.     return result == 0;
  9. }

(3)獲得目錄地址app


URLsForDirectory:inDomains: method 返回NSURL形式的目錄地址
NSSearchPathForDirectoriesInDomains 返回字符串形式的目錄地址
NSHomeDirectory 返回程序根目錄
NSTemporaryDirectory 返回臨時文件目錄ui

(4)相關變量定義編碼

  1. NSSearchPathDirectory
  2. enum {
  3. NSApplicationDirectory = 1,//Supported applications (/Applications)
  4. NSDemoApplicationDirectory,//Unsupported applications and demonstration versions
  5. NSDeveloperApplicationDirectory,//Developer applications (/Developer/Applications)
  6. NSAdminApplicationDirectory,//System and network administration applications
  7. NSLibraryDirectory,//Various user-visible documentation, support, and configuration files (/Library)
  8. NSDeveloperDirectory,//Developer resources (/Developer)
  9. NSUserDirectory,//User home directories (/Users)
  10. NSDocumentationDirectory,//
  11. NSDocumentDirectory,//
  12. NSCoreServiceDirectory,//Location of core services (System/Library/CoreServices)
  13. NSAutosavedInformationDirectory = 11,//Location of user’s autosaved documents Library/Autosave Information
  14. NSDesktopDirectory = 12,//
  15. NSCachesDirectory = 13,//Location of discardable cache files (Library/Caches)
  16. NSApplicationSupportDirectory = 14,//Location of application support files (Library/Application Support)
  17. NSDownloadsDirectory = 15,//
  18. NSInputMethodsDirectory = 16,//
  19. NSMoviesDirectory = 17,//
  20. NSMusicDirectory = 18,//
  21. NSPicturesDirectory = 19,//
  22. NSPrinterDescriptionDirectory = 20,//
  23. NSSharedPublicDirectory = 21,//
  24. NSPreferencePanesDirectory = 22,//
  25. NSItemReplacementDirectory = 99,//
  26. NSAllApplicationsDirectory = 100,//
  27. NSAllLibrariesDirectory = 101//
  28. };
  29. typedef NSUInteger NSSearchPathDirectory;

  1. enum {
  2. NSUserDomainMask = 1,//用戶主目錄中
  3. NSLocalDomainMask = 2,//當前機器中
  4. NSNetworkDomainMask = 4,//網絡中可見的主機
  5. NSSystemDomainMask = 8,//系統目錄,不可修改(/System)
  6. NSAllDomainsMask = 0x0ffff,//所有
  7. };
  8. 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:代理

  1. – archiver:didEncodeObject:
  2. – archiverDidFinish:
  3. – archiver:willEncodeObject:
  4. – archiverWillFinish:
  5. – 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:
  1. – unarchiver:cannotDecodeObjectOfClassName:originalClasses:
  2. – unarchiver:didDecodeObject:
  3. – unarchiver:willReplaceObject:withObject:
  4. Finishing Decoding
  5. – unarchiverDidFinish:
  6. – 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,記得保存。結束過程示例:
  1. NSManagedObjectContext *managedObjectContext = nil;
  2. // 獲得模版
  3. NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"YOUR_XCDATAMODELD_FILE_NAME" withExtension:@"momd"];
  4. NSManagedObjectModel* managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
  5. // 具體文件,DOCUMENT_DICRECTORY應該是nsurl的..
  6. NSURL *storeURL = [@"DOCUMENT_DICRECTORY" URLByAppendingPathComponent:@"SQLITE.sqlite"];
  7. NSError *error = nil;
  8. NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
  9. // 使用SQLite存儲
  10. if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
  11. // 出錯
  12. else
  13. {
  14. // 獲得操做空間
  15. managedObjectContext = [[NSManagedObjectContext alloc] init];
  16. [managedObjectContext setPersistentStoreCoordinator:coordinator];
  17. }
  18. // 獲得具體的表
  19. NSEntityDescription *entityDescription = [NSEntityDescription
  20. entityForName:@"ONE_ENTITY_NAME"
  21. inManagedObjectContext:managedObjectContext];
  22. // 操做語句
  23. NSFetchRequest *request = [[NSFetchRequest alloc] init];
  24. [request setEntity:entityDescription];
  25. // 操做語句的條件
  26. NSPredicate *pred = [NSPredicate predicateWithFormat:@"PREDICATE_SECTION"];
  27. [request setPredicate:pred];
  28. NSManagedObject *manageObject = nil;
  29. // 執行操做,獲得多條具體數據
  30. NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error];
  31. if (objects == nil) {
  32. // 出錯
  33. }
  34. if ([objects count] > 0)
  35. // 多條,取第一條
  36. manageObject = [objects objectAtIndex:0];
  37. else
  38. // 沒有相應的,就建立
  39. manageObject = [NSEntityDescription
  40. insertNewObjectForEntityForName:@"TABLE_NAME"
  41. inManagedObjectContext:managedObjectContext];
  42. // 改變她的一個字段的值 
  43. [manageObject setValue:@"VALUE" forKey:@"ONE_FIELD_NAME_OF_THE_TABLE"];
  44. [request release];
  45. // 保存,結束
  46. [managedObjectContext save:&error];
複製代碼
(四).SQLite
引入SQLite庫,加入頭文件,使用C API操做.繁瑣的地方在於只能存儲c數據格式,須要來回轉換.過程示例:
  1. // 聲明數據庫
  2. sqlite3 *database;
  3. // 打開
  4. if (sqlite3_open("數據庫文件路徑", &database) != SQLITE_OK) {
  5. sqlite3_close(database);
  6. // 出錯
  7. }
  8. char *errorMsg;
  9. // 執行無返回語句
  10. if (sqlite3_exec (database, "增刪改創語句",NULL, NULL, &errorMsg) != SQLITE_OK) {
  11. sqlite3_close(database);
  12. // 出錯
  13. }
  14. sqlite3_stmt *statement;
  15. // 執行查詢語句
  16. if (sqlite3_prepare_v2(database, "查詢語句",-1, &statement, nil) == SQLITE_OK) {
  17. // 遍歷結果
  18. while (sqlite3_step(statement) == SQLITE_ROW) {
  19. int row = sqlite3_column_int(statement, 0);
  20. // 第一列數據
  21. char *rowData = (char *)sqlite3_column_text(statement, 1);
  22. }
  23. // 結束遍歷
  24. sqlite3_finalize(statement);
  25. }
  26. // 關閉數據庫
  27. sqlite3_close(database);
相關文章
相關標籤/搜索