本地儲存

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, 申請不到鎖直接返回.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容