sqlite 中插入字符和接收到的處理方法
除了'其他都是在特殊符號前面加/, keyWord = keyWord.replace("/","http://");
什么是NSManagedObject模型
NSManagedObject 是 NSObject 的子類, 也是 core data 里面很重要的組成部分. 是一個通用類, 實現了 Core Date 模型層所需的基本功能, 用戶可以通過 NSManagedObject 建立自己的數據模型.
實現過多線程的 Core Data
- core data 中的 NSManagedObjectContext 在多線程中不安全
- 如果想要多線程訪問 coreData 的話, 最好的方法是一個線程一個 NSManagedObjectContext
- 每一個 NSManagedObjectContext 對象實例都可以使用同一個 NSPersistentStoreCoordinator 實例, 這是因為 NSManagedObjectContext 會在使用 NSPersistentStoreCoordinator 前上鎖.
NSPersistentStoreCoordinator, NSManagedObjectContext 和 NSManagedObject 中的哪些需要在線程中創建或者傳遞
coreDate
- CoreData 是對 SQLite 數據庫的封裝
- CoreData 中有三個對象是必須掌握的
- NSManagedObject: 只要定義一個類繼承與該類就會創建一張與之對應的表, 也就是一個集成該類的類對應一張表, 每一個通過集成該類創建出來的對應, 都是該類對應的一條數據
- NSManagedObjectContext: 用于操作數據庫, 只要有類它就能對數據庫的表進行操作增刪改查.
- NSPersistentStoreCoordinator: 決定數據存儲的位置 (SQLite / XML / 其他數據里)
客戶端緩存機制的描述
分類:
- 內存數據緩存
- 數據緩存
- 文件緩存
過程: - 每次想要獲取數據的時候
- 先檢測內存中有沒有緩存
- 在檢測本地有沒有緩存 (數據庫/文件)
- 最終發送網絡請求
- 將服務器返回的網絡數據進行緩存 (內存, 數據庫, 文件), 方便下次讀取.
序列化和反序列化
- 序列化把對象轉換成字節序列過程
- 反序列化把序列恢復成對象
作用: 把對象寫到文件或者數據庫中, 并且讀出來.
OC中實現復雜對象的儲存
- 遵循 NSCoding 協議, 實現復雜對象的存儲, 實現該協議后可以對其進行打包或者解包, 轉化為 NSDate
iOS 中常用的數據儲存方式
- NSUserDefault: 一般儲存偏好設置
- KeyChain: 提供了一種安全的保存私密信息(密碼,序列號,證書等)的方式。每個ios程序都有一個獨立的keychain存儲。我就是上傳了一個UDID 給后臺
- File: plist, Archiver, Stream 三種方式進行存檔
- DB: 包括 core Data 和 FMDB.
SQLite 分析
理解:
- SQLite 是目前主流的嵌入式關系型數據庫, 特點是輕量級, 跨平臺, 當前很多嵌入式操作系統都將其作為數據庫首選
- SQLite 是一款輕型數據庫, 但是功能不亞于很多大型關系數據庫.
特點:
- 基于 C 語言開發的輕型數據庫
- 在 iOS 中需要是用 C 語言語法進行數據庫操作, 訪問. (不能使用 Objc 進行訪問, 因為 SQLite 是基于 C 語言寫的)
- SQLite 中采取的是動態數據存儲, 一開始定義了一種類型, 以后的實際操作也可以存儲其他類型. 但是推薦一開始創建適合的類型. (特別需要考慮應用跨平臺)
- 建立連接之后通常不需要關閉連接 (也可以手動關閉)
過程:
- 打開數據庫, 利用 sqlite3_open() 打開數據庫會指定一個保存文件保存路徑, 如果文件存在直接打開, 不存在創建打開. 打開數據庫可以得到一個 sqlite3 類型對象, 后面需要借助這個對象進行其他操作.
- 執行 SQL 語句, 執行 SQL 語句有包括返回值和沒有返回值的語句.
- 對于沒有返回值的語句 (增刪改等) 直接通過 sqlite3_exec() 函數執行
- 對于有返回值的語句, 首先通過 sqlite_prepare_v2() 進行 sql 語句評估 (語法檢測), 然后通過 sqlite3_step() 一次取出查詢結果的每一行數據, 對于每行數據都可以通過對應的 sqlite3_column 類型 () 方法活得對應列的數據, 如此返回循環知道便利完成. 最后釋放句柄.
FMDB 分析
理解:
- FMDB 是一個處理數據儲存的第三方框架, 框架是對 sqlite 的封裝, 整個框架非常輕量級但又不失靈活, 而且更加面向對象.
特點:
- FMDB 基于 lib sqlite3 框架的封裝, 使用方法類似, 使用前打開一個數據庫, 這個數據庫文件存在則直接打開否則創建打開.這里 FMDB 引入一個 MFDatabase 對象來標示數據庫, 打開數據庫操作全部依賴這個對象.
- 在 FMDB 中提供了倆個方法, 有參數對應的是executeQuery, 無參數的是executeUpdate. 注意點: 如果調用格式化參數的 sql 語句的時候, 格式化符號使用的是 "?" 而不是 "%@".
- 直接使用 lib sqlite3 進行數據操作線程是不安全的, 不同線程同事操作一個表就會發生意想不到的效果. 多線程中使用 FMDatabaseQueue 對象, 相比 FMDatabase 而言, 他的線程是安全的.
注意: 經常反問自己, 經常用什么數據儲存, 問什么選擇它? 什么是序列化? Sqlite 是直接用它還是封裝了它的第三方庫? sqlite 和 core data 有什么區別?
iOS 平臺怎么做數據的持久化, coredata 和sqlite 有誤必然的聯系; coredata 是一個關系型數據庫嗎
- iOS 可以有始終持久化數據的方式: 屬性列表, 對象歸檔, SQLite3 和 Core Data
- coredata 可以使你以圖形界面的方式快速定義 app 的數據模型, 同時在你的代碼中容易獲取到它.
- coredata 可以使你以圖形界面的方式快速的定義 app 的數據模型, 同時在你的代碼中容易獲取到它.
- coredata 提供了基礎結構去處理常用的功能, 例如保存,恢復,撤銷和重做, 允許你在 app 中繼續創建新的任務.
- 在使用 coredata 的時候, 你不用安裝額外的數據庫系統, 因為 coredata 使用內置的 aqlite 數據庫.
- coredata將你 app 的模型層放入到一組定義在內存中的數據對象.
- coredata 會最終這些對象的改變, 同時可以根據需要做相應的改變, 例如用戶自行撤銷命令.
- 當 coredata 在對你 app 數據的改變進行保存的時候, coreData 會把這些數據歸檔, 并且永久保存
- mac os x 中的 sqlite 庫, 它是一個輕量級功能強大的關系數據引擎, 也很容易嵌入到應用程序. 可以在多個平臺使用, sqlite 是一個輕量級的嵌入式sql數據庫編程.
- 與 coreData 框架不同的是, sqlite 是使用程序式的sql的主要的 API 來直接操作數據表.
- Core Data 不是一個關系型數據庫, 也不是關心新數據庫管理系統.
- 雖然 Core Data 支持 SQLIte 作為一種儲存類型, 但它不能使用任意的 SQLite 數據庫.
- Core Data 在使用的過程中穿甲你這個數據庫. core Data支持對一, 對多的關系.
修改數據庫中的字段
- 增加表字段: ALTER TABLE 表名 ADD COLUMN 字段名 字段
- 刪除表字段: ALTER TABLE 表明 DROP COLUMN 字段名:
- 修改表字段: ALTER TABLE 表名 RENAME COLUMN 舊字段名 TO 新字段名
SQLite 數據存儲是怎么用的
- 添加 SQLite 動態庫: 導入頭文件: #import <sqlite3.h>
- 利用 C 語言函數創建/打開數據庫, 編寫 SQL 語句
iOS 沙盒目錄結構是怎樣的, App Bundle 里面有什么
沙盒結構:
- Application: 存放程序源文件, 上架前經過數字簽名, 上架后不可修改
- Documents: 常用目錄, iCloud 備份目錄, 存放數據, 這里不能緩存文件, 否則上架不能通過
- Library:
- Caches: 存放體積大又不需要備份的數據, SDWebImage 緩存路徑就是這個
- Preference: 設置目錄, iCloud 會備份設置信息.
- tmp: 存放臨時文件, 不會被被備份, 而且這個文件下的數據有可能隨時被清除的可能.
App Bundle 里面有什么
- Info.plist: 此文件包含了應用程序的配置信息, 系統以來此文件以獲取應用程序的相關信息.
- 可執行文件: 這個文件包含應用程序的入口和通過靜態連接到應用程序 target 的代碼
- 資源文件: 圖片, 聲音文件一類的
- 其他: 可以嵌入定制的數據資源
如何儲存用戶的一些敏感信息, 如登錄的 token
- 使用 keychain 儲存, 也就是鑰匙串, 使用 keychain 需要導入 security 框架
使用 NSUserDefaults 時, 如何處理布爾的默認值? (比如返回 NO, 不知道是真的 NO 還是沒有設置過)
if([[NSUserDefaults standardUserDefaults] objectForKey:ID] == nil) {
NSLog(@"沒有設置????????");
}
MD5 和 Base64 的區別是什么, 各自使用場景是什么
做過加密相關的功能, 幾乎都會使用到 MD5 和 Base 64, 他們倆著在實際開發中是最常用的
- MD5: 是一種不可逆的摘要算法, 用于生成摘要, 無法逆著破解得到原文. 常用的是生成32位照耀, 用于驗證數據的有效性. 比如, 在網絡請求接口中, 通過將所有的參數生成摘要, 客戶端和服務端采用同樣的規則生成摘要, 這樣可以防篡改. 又如, 下載文件的時候, 通過生成文件的摘要, 用于驗證文件是后損壞.
- base64: 屬于加密算法, 是可逆, 經過 encode 后, 可以 decode 得到原文. 在開發中, 有的公司上傳圖片采用的是將圖片轉換成 base 64 字符串, 在上傳. 在做加密相關的功能時, 通常會將數據進行base 64 加密/ 解密.
plist文件用來做什么的. 一般用它來處理一些什么方面的問題.
- plist 是 iOS 系統中特有的文件格式. 我們常用的 NSUserDefaults 編號設置實質上就是 plist 文件長做. plist 文件是用持久化儲存數據的.
- 通常我們使用它來儲存編號設置, 以及那些少量的, 數據結構比較復雜的不適合儲存數據庫的數據. 比如, 我們要存儲全國的城市名稱和id, 那么我們要優先選擇 plist 直接持久化存儲, 因為更簡單.
當存儲大塊數據怎么做
- NSUserDefault: 雖然它很 nice 也很便捷, 但是它只適用于小數據, 比如一些簡單的布爾型的設置選項, 在大點你就得考慮其他方式了
- XML結構化歸檔: 你需要讀取整個文件到內存里面去解析, 這樣是很不經濟.
- NSCoding: 也存在讀寫文件問題,
- SQLite或者CoreData: 這種情況下推薦使用這倆個
怎么解決sqlite鎖定的問題
- 設置數據庫鎖定的處理函數
int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*);
函數可以定義一個函數回調, 當出現數據庫忙時, sqlite 會調用改函數, 當回調法術為 NULL 時, 清除 busy handle, 申請不到鎖直接返回, 回調函數的第二個函數會被傳遞為此次忙時間調用該函數的次數, 回掉函數返回非 0, 數據庫會重試當前操作, 返回0折當前操作返回 SQLITE_BUSY
- 設定鎖定時的等待時間
int sqlite3_busy_timeout(sqlite3*, 60);
定義一個毫秒數, 當未達到該毫秒數時, dqlite 會 sleep 并從事當前操作, 如果超過ms毫秒, 仍然申請不到需要的鎖, 當前操作返回 sqlite_BUSY 當 ms <= 0 時, 清除 busy handle, 申請不到鎖直接返回.