咱們從0開始封了一個面向OC模型的數據庫就要結束了,開發工做其實在上一篇就作完了,以後作了一些小的優化以及代碼的調整來發布這篇文章,先看一下咱們最終形態。git
咱們支持的類型有:github
全部的基本數據類型(int,float),NSNumber,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,
UIImage,NSURL,UIColor,NSSet,NSRange,NSAttributedString,NSData,自定義模型,以及數組、字典、模型相互嵌套
複製代碼
類名 | 做用 |
---|---|
CWModelProtocol.h | 須要遵照以及實現的協議方法(用戶關注) |
CWSqliteModelTool.h、CWSqliteModelTool.m | 本庫操做數據庫的全部API(用戶關注) |
CWDatabase.h、CWDatabase.m | 直接調用sqlite底層API的類 |
CWModelTool.h、CWModelTool.m | 處理模型的工具類 |
CWSqliteTableTool.h、CWSqliteTableTool. | 處理數據庫表的工具類 |
咱們但願保存幾所學校的資料到數據庫。sql
以上的層級關係有模型嵌套數組嵌套模型的場景、模型嵌套模型再嵌套數據再嵌套模型的場景也就模型直接嵌套模型的場景。數據庫
而後咱們使用工廠方法來快速構造各個模型,用來搭建整個學校數組
學校的結構設定好了以後~咱們用代碼構造一所所這樣的夢想學院。。而後咱們要使用咱們的數據庫將學校的資料保存起來。bash
+ (NSString *)primaryKey {
// 返回schoolId爲主鍵
return @"schoolId";
}
複製代碼
// 使用工廠方法建立的shool模型
CWSchool *school = [self cwSchoolWithID:9999 name:@"夢想學院"];
// 調用保存或者更新方法,uid爲userId,對應數據庫的名字,targetId爲目標ID,與數據庫表名相關,能夠傳nil。
BOOL result = [CWSqliteModelTool insertOrUpdateModel:school uid:nil targetId:nil];
複製代碼
爲何要設置兩個多餘的參數uid與TargetId?爲了迎合下面一些場景,若是你不關注,傳nil便可架構
關於數據庫升級以及數據庫遷移,假設我存在數據庫的數據爲聊天記錄Message,裏面有10個成員變量,有一天,業務的提高,我要在Message裏面多加一個成員變量,如新增一個成員變量用來標記是不是撤回的消息,這個時候因爲數據庫的表結構固定死了沒這個字段,插入數據確定是失敗的,爲了解決這個問題,咱們將要進行數據庫升級,而且要將以前的數據都保留下來,這個要怎麼作呢?這裏壓根不須要你思考這個問題,我做爲一個負責任的男人,我很負責任的告訴你,假如你的Message模型新增長了1個2個10個成員變量,你只管加,加了以後只管調用上面的方法存,數據的升級以及遷移咱們默認會幫你完成!!!框架
// result內的元素爲CWSchool的模型
NSArray *result = [CWSqliteModelTool queryAllModels:[CWSchool class] uid:nil targetId:nil];
複製代碼
查詢方法返回值是一個數組,這個數組裏面的數據所有爲CWSchool的模型,由於咱們承諾過,保存的時候是模型A,查詢出來的必定也是模型A。工具
CWSchool *school = [self cwSchoolWithID:9999 name:@"夢想學院"];
// 刪除school數據
BOOL result = [CWSqliteModelTool deleteModel:school uid:nil targetId:nil];
複製代碼
這個方法,會根據傳進來的模型的主鍵值去找到數據表裏面的數據刪除。post
咱們的功能基本都在這了,除了還有一些條件查詢與刪除沒寫在這裏。有人會問,數據庫不是增刪查改4個嗎?怎麼你只有3個,咱們也實現了改的操做,只是咱們把這個操做和增合併成了一個方法,也就是這裏的第一個方法,咱們會根據主鍵來判斷數據庫內是否存在對應的數據,若是存在,咱們則進行更新操做,不存在則插入數據。