主页 WCDB实践记录
Post
Cancel

WCDB实践记录

前言

本文具有强烈的个人感情色彩,如有观看不适,请尽快关闭. 本文仅作为个人学习记录使用,也欢迎在许可协议范围内转载或分享,请尊重版权并且保留原文链接,谢谢您的理解合作. 如果您觉得本站对您能有帮助,您可以使用RSS方式订阅本站,感谢支持!.

最近在忙啥?

洲哥最近在跟 WCDB 斗智斗勇,公司做 IM,一套很老的代码需要维护,为了打好底层基础,解决上层业务问题决定按批次从原来的 FMDB 迁移到 WCDB.

遇到的问题

在使用 WCDB 的过程中遇到了一个很低级的错误,就是 where 语句后面接的判断条件问题

先来看下代码和 业务问题的场景复现

1
2
3
4
5
6
7
8
9
10
- (BOOL)updateMsgHeight:(SYMessage *)msg toTable:(NSString *)tableName {
    if (tableName.length == 0) { return NO; }
    if (msg.messageId.length == 0) { return NO; }
    BOOL result = [[self dataBase] updateRowsInTable:[self tablenameByID:tableName]
                                          onProperty:SYMessage.chatMsgHeight
                                           withValue:msg.chatMsgHeight
                                               where:{SYMessage.messageId == msg.messageId && 
                                               		  SYMessage.type = msg.type}];
    return result;
}

cell的高度不对劲

经过 FLEX工具 查看数据库文件,发现数据库中的chatMsgHeight值都是一样的.

经过我仔细排查了所有 SQL 语句发现有一处这样的调用 在控制台.

1
2
UPDATE msg_10003600 SET chatMsgHeight=? WHERE 1.000000 

它正确的形式应该是这样的

1
SQL: UPDATE msg_10003600 SET chatMsgHeight=? WHERE ((messageId='936542df77de41778139a42b4f4be296') AND (type=2))

想都不用想SQL语句 where 后的条件 一直为 true ,才会出现这种低级到不能在低级的错误.

纠正原有代码如下:

1
2
3
4
5
6
7
8
9
10
- (BOOL)updateMsgHeight:(SYMessage *)msg toTable:(NSString *)tableName {
    if (tableName.length == 0) { return NO; }
    if (msg.messageId.length == 0) { return NO; }
    BOOL result = [[self dataBase] updateRowsInTable:[self tablenameByID:tableName]
                                          onProperty:SYMessage.chatMsgHeight
                                           withValue:msg.chatMsgHeight
                                               where:{SYMessage.messageId == msg.messageId && 
                                               		  SYMessage.type == msg.type}];
    return result;
}

这个问题出在了SYMessage.type == msg.type而不是SYMessage.type = msg.type.

== 恒等于
= 赋值
WCDB 并没有提示错误因为这不属于错误,这属于正常的代码赋值,C++编译器也不会报错.

所以这个 小伙伴们还是注意.虽然明明是我少写了等号导致的,毕竟 WCDB 不是编译器不能为我们纠正词法分析以及语法分析语义分析亦或是文法分析等 编译原理的知识错误.

说说使用 WCDB 后的真实体验

快! 方便!代码简洁!

我把聊天功能涉及到的聊天会话列表、消息列表、等核心模块全部迁移到 WCDB.

还有个坑需要小伙伴们注意、FMDB 迁移到 WCDB 一定切记 要做就做彻底、一次全部替换、否则很容易出现队列的死锁竞争.不信邪的可以试试.

开发文档归类

WCDB - 腾讯开源的移动数据库框架 这个连接国内打开比较快

FLEX调试工具 可以实时查看 app 中各种 UIView、网络、对象、内存、沙盒文件等等.

总结

下一步准备看看WCDB源码实现,和分享一些经常使用的技巧, WCDB 让我重新学习了一遍数据库知识.

该博客文章由作者通过 CC BY 4.0 进行授权。

UTIs苹果官方的文件扩展名全集

如何判断NSString是纯数字类型