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):


其實(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的代碼的,后面你引用也不需要再去修改!希望大家理解這里