WCDB 實(shí)踐心得

1.WCDB 創(chuàng)建
創(chuàng)建的路徑上的最后文件名的后綴必須有.db 字樣,否則創(chuàng)建失敗
2.一個(gè)路徑的一個(gè)db可以有多個(gè)表,一個(gè)路徑下可以多個(gè)不同名稱的db

3.為什么WCDB的分類,只有.h文件,沒有.m文件,更沒有對協(xié)議WCTTableCoding的實(shí)現(xiàn)呢?

仔細(xì)觀察下面兩張圖片,你會發(fā)現(xiàn):


image.png

image.png

其實(shí)這是兩個(gè).h 共同一個(gè).mm文件實(shí)現(xiàn)。
其中關(guān)于協(xié)議的WCTTableCoding的實(shí)現(xiàn),在.mm中的特定宏里面實(shí)現(xiàn)了定義于具體實(shí)現(xiàn)!
(WCDB_IMPLEMENTATION,用于在類文件中定義綁定到數(shù)據(jù)庫表的類。同時(shí),該宏內(nèi)實(shí)現(xiàn)了WCTTableCoding。因此,開發(fā)者無須添加更多的代碼來完成WCTTableCoding的接口)

4.ORM關(guān)系模型 與WCDB數(shù)據(jù)庫的對應(yīng)的關(guān)系
ORM :Object Related Model 在程序語言中就是對應(yīng)的不是對象數(shù)據(jù),而是對象指針。
例子如下:
stu1 = [[student alloc] initWithDic:dic];
//下面這兩句話,因?yàn)镺RM關(guān)系綁定指針,導(dǎo)致會直接覆蓋第一個(gè)
stu1.isAutoIncrement = YES;
isSuccess = [db insertOrReplaceObject: stu1 into:NSStringFromClass([student class])];
改變指針stu1的指向,這里只能執(zhí)行更新操作,不能新增。
新建一個(gè)新對象,可以實(shí)現(xiàn)新增。

5.實(shí)現(xiàn)自定義對象的NSCopy協(xié)議,可以避免問題四

6.本地一直遞增主鍵,必須加這句話,實(shí)現(xiàn)主鍵遞增
stu1.isAutoIncrement = YES;

7.WINQ的接口包括但不限于:
一元操作符:+、-、!等
二元操作符:||、&&、+、-、*、/、|、&、<<、>>、<、<=、==、!=、>、>=等
范圍比較:IN、BETWEEN等
字符串匹配:LIKE、GLOB、MATCH、REGEXP等
聚合函數(shù):AVG、COUNT、MAX、MIN、SUM等

8.as重定向,它可以將一個(gè)查詢結(jié)果重定向到某一個(gè)字段
快速進(jìn)行邏輯處理,將字段賦值到指定字段。

9.事務(wù)不要輕易使用,最好在有一組連貫的數(shù)據(jù)庫操作時(shí),才使用事務(wù)
事務(wù)保證的是:要么都不做,要么連貫地做成功!

10.復(fù)雜對象模型
objectA里面還有objectB的引用:
情況1:如果objectB比較簡單,可以使用類字段綁定,將objectB數(shù)據(jù)轉(zhuǎn)成特定格式的數(shù)據(jù)來存儲。好處:不用查詢,調(diào)用簡單。一對一關(guān)系
(遵守<WCTTableCoding,NSCoding>,可以使用模板創(chuàng)建)
情況2:如果objectB比較復(fù)雜,可以使用id關(guān)聯(lián),即主鍵關(guān)系。兩個(gè)對象,兩張表。適用于1對1.
情況3:如果有1對多關(guān)系,可以先將將多個(gè)objectB存入一張表中,objectA與這張表的表明進(jìn)行關(guān)聯(lián)。@[ObjectB1,ObjectB2,ObjectB3,......]

Ps: 注意一個(gè)小問題:引用,只是一個(gè)指針,沒有內(nèi)存,如果賦值,請務(wù)必創(chuàng)建ObjectB對象。否則類字段綁定時(shí),沒有數(shù)據(jù)可以綁定

11.遇到的localId的問題:
我定義的localId是 自增的主鍵 類型為int ,如果輸出數(shù)據(jù)庫該數(shù)據(jù)字段,使用%zd 會出現(xiàn)異常(數(shù)據(jù)跳動(dòng),且非常大),讀到數(shù)據(jù)會變化!改為%d,無此問題!
建議對象輸出時(shí)嚴(yán)格遵守格式化輸出的格式!

12 多使用分類,避免在.h文件中引入WCDB.h:
原因如下:
定義該類遵守WCTTableCoding協(xié)議,可以在類聲明上定義,也可以通過文件模版在category內(nèi)定義。
這里推薦大家使用第二種,通過文件模板在category內(nèi)定義,為什么要這樣做,就是為了隔離Objective-C++代碼
WCDB基于WINQ,引入了Objective-C++代碼,所以對于引入了WCDB的源文件,都需要把后綴.m改為.mm,為減少影響范圍,可以通過Objective-C的category特性將其隔離,達(dá)到只在model層使用Objective-C++編譯,而不影響Controller和View。這一點(diǎn)在
Wiki中是有提到的,
這樣做的好處是不知道大家都有沒有理解,這么說,要是你通過第一種方法,不通過category定義,而是選擇了在類聲明中寫,這樣的話Message.h 中就需要有宏WCDB_PROPERTY,這樣你就在Message.h使用了WCDB的代碼,當(dāng)你把Message.h在其他Controller/View中引用的時(shí)候,那相應(yīng)的Controller/View的.m就需要修改成.mm 。造成不必要的工作,但你用第二種方法寫的時(shí)候,你就發(fā)現(xiàn)在Message.h中是沒有任何的關(guān)于WCDB的代碼的,后面你引用也不需要再去修改!希望大家理解這里

參考文檔:
1.基本用法:
鏈接1
鏈接2
2.高級用法:鏈接3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 14,324評論 0 15
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,680評論 19 139
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 26,253評論 7 249
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,648評論 30 472
  • 這幾天我又感覺我的身體健康又出現(xiàn)了不適,特別是我的耳朵發(fā)沉。于老師今天上午來綏傳法是第六天,我每天都是歡喜...
    金銀林閱讀 284評論 0 0

友情鏈接更多精彩內(nèi)容