除’其餘的都是在特殊字符前面加「/」,而 ' -> '' 。方法:keyWord = keyWord.replace("/","//");css
NSManagedObjcet是NSObject的子類,Core Date的重要組成部分。是一個通用類,實現了Core Date模型層所需的基本功能,用戶能夠經過NSManagedObjcet創建本身的數據模型。html
1> CoreData是對SQLite數據庫的封裝 2> coreData中有三個對象是必須掌握的, NSManagedObject :只要定義一個類繼承於該類就會建立一張與之對應的表, 也就是一個繼承於該類的類就對應一張表. 每個經過繼承該類建立出來的對象,都是該類對應的表中的一條數據 NSManagedObjectContext: 用於操做數據庫, 只要有類它就能對數據庫的表進行增刪改查 NSPersistentStoreCoordinator: 決定數據存儲的位置 (SQLite/XML/其它文件中) 3> Core data自己並非一個併發安全的架構因此在多線程中實現Core data會有問題.問題在於 >2.1 CoreData中的NSManagedObjectContext在多線程中不安全 >2.2若是想要多線程訪問CoreData的話,最好的方法是一個線程一個NSManagedObjectContext >2.3每一個NSManagedObjectContext對象實例均可以使用同一個NSPersistentStoreCoordinator實例,這是由於NSManagedObjectContext會在便用NSPersistentStoreCoordinator前上鎖
SQLite是目前主流的嵌入式關係型數據庫,其最主要的特色就是輕量級、跨平臺,當前不少嵌入式操做系統都將其做爲數據庫首選。git
雖然SQLite是一款輕型數據庫,可是其功能也毫不亞於不少大型關係數據庫。github
學習數據庫就要學習其相關的定義、操做、查詢語言,也就是你們平常說得SQL語句。和其餘數據庫相比,SQLite中的SQL語法並無太大的差異,所以這裏對於SQL語句的內容不會過多贅述,你們能夠參考SQLite中其餘SQL相關的內容,這裏仍是重點講解iOS中如何使用SQLite構建應用程序。先看一下SQLite數據庫的幾個特色:面試
Core Data使用起來相對直接使用SQLite3的API而言更加的面向對象,操做過程一般分爲如下幾個步驟:算法
iOS中能夠有四種持久化數據的方式: 屬性列表、對象歸檔、SQLite3和Core Datasql
coredata可使你以圖形界面的方式快速的定義app的數據模型,同時在你的代碼中容易獲取到它。數據庫
coredata提供了基礎結構去處理經常使用的功能,例如保存,恢復,撤銷和重作,容許你在app中繼續建立新的任務。編程
在使用coredata的時候,你不用安裝額外的數據庫系統,由於coredata使用內置的sqlite數據庫。數組
coredata將你app的模型層放入到一組定義在內存中的數據對象。
coredata會 追蹤這些對象的改變,同時能夠根據須要作相應的改變,例如用戶執行撤銷命令。
當coredata在對你app數據的改變進行保存的時 候,core data會把這些數據歸檔,並永久性保存。
mac os x中sqlite庫,它是一個輕量級功能強大的關係數據引擎,也很容易嵌入到應用程序。能夠在多個平臺使用,sqlite是一個輕 量級的嵌入式sql數據庫編程。
與coredata框架不一樣的是,sqlite是使用程序式的,sql的主要的API來直接操做數據表。
Core Data不是一個關係型數據庫,也不是關係型數據庫管理系統(RDBMS)。
雖然Core Dta支持SQLite做爲一種存儲類型, 但它不能使用任意的SQLite數據庫。
Core Data在使用的過程種本身建立這個數據庫。Core Data支持對1、對多的關係。
博客地址: http://blog.csdn.net/jasonblog/article/details/17842535
博客地址: http://blog.csdn.net/wscqqlucy/article/details/8464398
數據庫左鏈接和右鏈接的區別:主表不同經過左鏈接和右鏈接,最小條數爲3(記錄條數較小的記錄數),最大條數爲12(3×4)
沙盒結構
App Bundle 裏面有什麼
使用keychain來存儲,也就是鑰匙串,使用keychain須要導入Security框架
自定義一個keychain的類
#import <Security/Security.h> @implementation YCKKeyChain +(NSMutableDictionary *)getKeychainQuery:(NSString *)service { return [NSMutableDictionary dictionaryWithObjectsAndKeys: (__bridge_transfer id)kSecClassGenericPassword,(__bridge_transfer id)kSecClass, service, (__bridge_transfer id)kSecAttrService, service, (__bridge_transfer id)kSecAttrAccount, (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock, (__bridge_transfer id)kSecAttrAccessible, nil]; } +(void)save:(NSString *)service data:(id)data { // 得到搜索字典 NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; // 添加新的刪除舊的 SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery); // 添加新的對象到字符串 [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData]; // 查詢鑰匙串 SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL); } +(id)load:(NSString *)service { id ret = nil; NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; // 配置搜索設置 [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData]; [keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey: (__bridge_transfer id)kSecMatchLimit]; CFDataRef keyData = NULL; if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) { @try { ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData]; } @catch (NSException *e) { NSLog(@"Unarchive of %@ failed: %@", service, e); } @finally { } } return ret; } +(void)delete:(NSString *)service { NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery); }
在別的類實現存儲,加載,刪除敏感信息方法
// 用來標識這個鑰匙串
static NSString const KEY_IN_KEYCHAIN = @"com.yck.app.allinfo";
// 用來標識密碼
static NSString const KEY_PASSWORD = @"com.yck.app.password";
+(void)savePassWord:(NSString *)password { NSMutableDictionary *passwordDict = [NSMutableDictionary dictionary]; [passwordDict setObject:password forKey:KEY_PASSWORD]; [YCKKeyChain save:KEY_IN_KEYCHAIN data:passwordDict]; } +(id)readPassWord { NSMutableDictionary *passwordDict = (NSMutableDictionary *)[YCKKeyChain load:KEY_IN_KEYCHAIN]; return [passwordDict objectForKey:KEY_PASSWORD]; } +(void)deletePassWord { [YCKKeyChain delete:KEY_IN_KEYCHAIN]; }
if([[NSUserDefaults standardUserDefaults] objectForKey:ID] == nil){ NSLog(@"沒有設置"); }
作過加密相關的功能的,幾乎都會使用到MD5和Base64,它們二者在實際開發中是最經常使用的。
• MD5:是一種不可逆的摘要算法,用於生成摘要,沒法逆着破解獲得原文。經常使用的是生成32位摘要,用於驗證數據的有效性。好比,在網絡請求接口中,經過將全部的參數生成摘要,客戶端和服務端採用一樣的規則生成摘要,這樣能夠防篡改。又如,下載文件時,經過生成文件的摘要,用於驗證文件是否損壞。 • Base64:屬於加密算法,是可逆的,通過encode後,能夠decode獲得原文。在開發中,有的公司上傳圖片採用的是將圖片轉換成base64字符串,再上傳。在作加密相關的功能時,一般會將數據進行base64加密/解密。
1> 設置數據庫鎖定的處理函數 int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); 函數能夠定義一個回調函數,當出現數據庫忙時,sqlite會調用該函數 當回調函數爲NULL時,清除busy handle,申請不到鎖直接返回 回調函數的第二個函數會被傳遞爲該由這次忙事件調用該函數的次數 回調函數返回非0,數據庫會重試當前操做,返回0則當前操做返回SQLITE_BUSY 2> 設定鎖定時的等待時間 int sqlite3_busy_timeout(sqlite3*, 60); 定義一個毫秒數,當未到達該毫秒數時,sqlite會sleep並重試當前操做 若是超過ms毫秒,仍然申請不到須要的鎖,當前操做返回sqlite_BUSY 當ms<=0時,清除busy handle,申請不到鎖直接返回
文章若有問題,請留言,我將及時更正。