1.WCDB 创建
创建的路径上的最后文件名的后缀必须有.db 字样,否则创建失败
2.一个路径的一个db可以有多个表,一个路径下可以多个不同名称的db
3.为什么WCDB的分类,只有.h文件,没有.m文件,更没有对协议WCTTableCoding的实现呢?
仔细观察下面两张图片,你会发现:
其实这是两个.h 共同一个.mm文件实现。
其中关于协议的WCTTableCoding的实现,在.mm中的特定宏里面实现了定义于具体实现!
(WCDB_IMPLEMENTATION,用于在类文件中定义绑定到数据库表的类。同时,该宏内实现了WCTTableCoding。因此,开发者无须添加更多的代码来完成WCTTableCoding的接口)
4.ORM关系模型 与WCDB数据库的对应的关系
ORM :Object Related Model 在程序语言中就是对应的不是对象数据,而是对象指针。
例子如下:
stu1 = [[student alloc] initWithDic:dic];
//下面这两句话,因为ORM关系绑定指针,导致会直接覆盖第一个
stu1.isAutoIncrement = YES;
isSuccess = [db insertOrReplaceObject: stu1 into:NSStringFromClass([student class])];
改变指针stu1的指向,这里只能执行更新操作,不能新增。
新建一个新对象,可以实现新增。
5.实现自定义对象的NSCopy协议,可以避免问题四
6.本地一直递增主键,必须加这句话,实现主键递增
stu1.isAutoIncrement = YES;
7.WINQ的接口包括但不限于:
一元操作符:+、-、!等
二元操作符:||、&&、+、-、*、/、|、&、<<、>>、<、<=、==、!=、>、>=等
范围比较:IN、BETWEEN等
字符串匹配:LIKE、GLOB、MATCH、REGEXP等
聚合函数:AVG、COUNT、MAX、MIN、SUM等
8.as重定向,它可以将一个查询结果重定向到某一个字段
快速进行逻辑处理,将字段赋值到指定字段。
9.事务不要轻易使用,最好在有一组连贯的数据库操作时,才使用事务
事务保证的是:要么都不做,要么连贯地做成功!
10.复杂对象模型
objectA里面还有objectB的引用:
情况1:如果objectB比较简单,可以使用类字段绑定,将objectB数据转成特定格式的数据来存储。好处:不用查询,调用简单。一对一关系
(遵守<WCTTableCoding,NSCoding>,可以使用模板创建)
情况2:如果objectB比较复杂,可以使用id关联,即主键关系。两个对象,两张表。适用于1对1.
情况3:如果有1对多关系,可以先将将多个objectB存入一张表中,objectA与这张表的表明进行关联。@[ObjectB1,ObjectB2,ObjectB3,......]
Ps: 注意一个小问题:引用,只是一个指针,没有内存,如果赋值,请务必创建ObjectB对象。否则类字段绑定时,没有数据可以绑定
11.遇到的localId的问题:
我定义的localId是 自增的主键 类型为int ,如果输出数据库该数据字段,使用%zd 会出现异常(数据跳动,且非常大),读到数据会变化!改为%d,无此问题!
建议对象输出时严格遵守格式化输出的格式!
12 多使用分类,避免在.h文件中引入WCDB.h:
原因如下:
定义该类遵守WCTTableCoding协议,可以在类声明上定义,也可以通过文件模版在category内定义。
这里推荐大家使用第二种,通过文件模板在category内定义,为什么要这样做,就是为了隔离Objective-C++代码
WCDB基于WINQ,引入了Objective-C++代码,所以对于引入了WCDB的源文件,都需要把后缀.m改为.mm,为减少影响范围,可以通过Objective-C的category特性将其隔离,达到只在model层使用Objective-C++编译,而不影响Controller和View。这一点在
Wiki中是有提到的,
这样做的好处是不知道大家都有没有理解,这么说,要是你通过第一种方法,不通过category定义,而是选择了在类声明中写,这样的话Message.h 中就需要有宏WCDB_PROPERTY,这样你就在Message.h使用了WCDB的代码,当你把Message.h在其他Controller/View中引用的时候,那相应的Controller/View的.m就需要修改成.mm 。造成不必要的工作,但你用第二种方法写的时候,你就发现在Message.h中是没有任何的关于WCDB的代码的,后面你引用也不需要再去修改!希望大家理解这里