從0開始弄一個面向OC數據庫--終結篇

前言

咱們從0開始封了一個面向OC模型的數據庫就要結束了,開發工做其實在上一篇就作完了,以後作了一些小的優化以及代碼的調整來發布這篇文章,先看一下咱們最終形態。git

  • 直接: 調用sqlite原生API操做數據庫,沒有中間框架。
  • 易用: 一行代碼實現數據庫增刪查改操做。
  • 多元: 支持全部基本數據類型、集合類型以及自定義模型。
  • 智能: 一行代碼,智能實現插入、更新、升級、遷移數據。
  • 強大: 0代碼支持數組嵌套模型、嵌套字典,字典嵌套模型等相互嵌套。
  • 靈活: 支持多種查詢、刪除操做,支持使用sql語句查詢、刪除。
  • 還原: 存入數據庫時爲A模型,查詢的數據必定還給你A模型。

咱們支持的類型有github

全部的基本數據類型(int,float),NSNumber,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,
UIImage,NSURL,UIColor,NSSet,NSRange,NSAttributedString,NSData,自定義模型,以及數組、字典、模型相互嵌套
複製代碼

這篇文章,將全方位介紹咱們數據庫--CWDB以及如何使用!

架構

類名 做用
CWModelProtocol.h 須要遵照以及實現的協議方法(用戶關注)
CWSqliteModelTool.h、CWSqliteModelTool.m 本庫操做數據庫的全部API(用戶關注)
CWDatabase.h、CWDatabase.m 直接調用sqlite底層API的類
CWModelTool.h、CWModelTool.m 處理模型的工具類
CWSqliteTableTool.h、CWSqliteTableTool. 處理數據庫表的工具類

在使用前,咱們先模擬一個對應的使用場景,要解決什麼問題,這個場景也是咱們demo中的演示代碼所展示的(你能夠打開demo在Clasess目錄下找到它)。

咱們但願保存幾所學校的資料到數據庫。sql

  • 用一個類來表示學校的資料,資料有學校id,名字,整個學校的全部班級,最好的班級,最優秀的老師的資料。
  • 有對應類來表示班級的資料,班級裏面有班級號,名稱,班級的全部老師,班級的全部學生,班主任以及班長。
  • 又分別有兩個類保存學生和老師的資料

以上的層級關係有模型嵌套數組嵌套模型的場景、模型嵌套模型再嵌套數據再嵌套模型的場景也就模型直接嵌套模型的場景。數據庫

而後咱們使用工廠方法來快速構造各個模型,用來搭建整個學校數組

  • 首先,全部的學生都是身高168,年齡20,體重100,性格溫和乖巧的女同窗
  • 其次,全部的老師都是身高155,年齡28,體重100的御姐老師
  • 再次,我給每一個班級添加5名鬆島🌟同窗,2名林🌟玲老師以及一位蒼老師班主任
  • 最後,我任命我爲全校惟一男人+校長,我在學校裏面開設了2種專業總共4個班級,1個技巧班,3個聲音班。保齡球玩得溜的關🌟琳同窗得到最優學生,技巧班爲最優班級,最好的老師固然是傳授身教的蒼老師

學校的結構設定好了以後~咱們用代碼構造一所所這樣的夢想學院。。而後咱們要使用咱們的數據庫將學校的資料保存起來。bash

How to use CWDB?

一、將CWDB拖進你的項目或者使用cocoapods(pod ‘CWDB’, '~> 1.5.0’),給項目添加sqlite3.0.tbd庫,須要存儲進數據庫的模型導入CWModelProtocol.h頭文件,而後遵照CWModelProtocol協議,實現下面這個方法返回對應的主鍵信息:

+ (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便可架構

  • uid:在作IM的時候,一個手機APP可能登錄不一樣的帳號,這個時候,咱們但願將不一樣帳號的信息,分爲不一樣的數據庫去保存,好比張三登錄了,咱們以張三.db 新建一個數據庫(以前沒有數據庫的狀況下),李四登錄了,咱們再以李四.db 新建一個數據庫,他們的信息分別存在本身的數據庫裏,這樣設計有什麼好處?咱們能夠把各個用戶的聊天記錄以及相關信息分別存儲,方便管理以及查詢,好比你去銀行存錢,你的錢必定是存在你的銀行卡里面,而不會是你、我、他的錢都存在同一個銀行卡里面,因此咱們這裏要傳uid,用來分辨是哪個用戶的數據庫。若是不傳,會默認爲CWDB公共數據庫。
  • targetId:首先咱們要說明,咱們數據庫的表名是以模型類型的名稱來命名的。在大部分狀況下,僅僅這樣是沒有問題的,可是,一樣是在IM的場景下,好比我和張三聊天,那麼我和張三的聊天記錄會以Message的模型存在Message的表裏面,若是我和李四聊天,那麼我和李四的聊天記錄也存在Message的表裏面嗎?這樣數據庫的數據會很是混亂,由於你可能會和更多的人聊天,那Message這個表會很是臃腫,因此咱們引入targetId目標ID這一參數,咱們的表名就會是《模型名稱+targetId》,以張三爲例,他的聊天記錄表就是Message張三,李四就是Message李四。若是你的數據庫裏面一個模型只須要統一管理一個表,那麼你傳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個,咱們也實現了改的操做,只是咱們把這個操做和增合併成了一個方法,也就是這裏的第一個方法,咱們會根據主鍵來判斷數據庫內是否存在對應的數據,若是存在,咱們則進行更新操做,不存在則插入數據。

咱們的演示代碼對數據庫操做提供了一個可視化的操做界面,大概是這樣子

固然插入的數據與查詢的數據是否對應從界面上是沒法看出來的,你能夠像我這樣打一個斷點查看

關於CWDB的更多用法,請轉到github:CWDB查看或者看代碼提供的API。。若是有不能知足你需求的場景或者有任何疑問,歡迎留言或者提issue,最終看在全校女同窗的面子上 give me one star !!

若是你也想封裝一個有不少女同窗的數據庫,可是沒有資料學的話,能夠前往我以前文章的傳送門,每一個功能的實現,咱們都提供了很是詳細的講解:

從0開始弄一個面向OC數據庫(一)

從0開始弄一個面向OC數據庫(二)

從0開始弄一個面向OC數據庫(三)

從0開始弄一個面向OC數據庫(四)

從0開始弄一個面向OC數據庫(五)

相關文章
相關標籤/搜索