首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

WCDB 踩坑之旅

本来这篇文章应该前天就发的,但是前天没能搞定 WCDB 的 demo,再加上昨天又遇到了一点小坑,就拖到了今天。

想必国内 iOS 圈的各位都已经知道这个东西了,三天前微信团队宣布他们的开源数据库框架 WCDB 的版本迭代到了正式的1.0,这么好的轮子自然是要体验一下的。以下是官方的一句话简介:

WCDB是一个高效、完整、易用的移动数据库框架,基于SQLCipher,支持iOS, macOS和Android。

而 iOS 方面,WCDB 有两个版本,分别支持 Objective-C 和 Swift。我先是把官方文档和 wiki 看了一遍,然后 clone 下来看了下 Sample code。之前我在 app 中使用的是 Realm,但是 Realm 槽点太多了,准备找个其他的框架取而代之,而 CoreData 名声在外,我不太敢去尝试,正好 WCDB 这时候出现了,我本是带着十分兴奋的心情来学习的,但是却在一开始遭遇各种挫折……

在安装上,官方支持 Cocoapods、Carthage 以及手动安装,我选择了最简单的 Cocoapods,以前 Carthage 才是我的首选,但是经历了几次 swift 版本更换,实在忍不了它的速度了。

WCDB 的数据库的创建位置需要自己指定,数据库文件的名字也是自己设定,这样就可以在 app 内维护多个数据库了。这是第一步,顺风顺水。

但是到了第二步,也就是模型绑定,就遇到麻烦了。用 Cocoapods 安装后Xcode 中就会集成 WCDB 的文件模板,通过这个模板就可以自动创建带有格式化代码的模型。

上面就是一个最最简单的固定模板,而这个模板生成的代码是有问题的……我用模板新建了一个模型,然后通过这个模型去创建一个表,就一直 crash。

WTF?报错的位置是一个 assertion,而这里写着这个 assertion 是不应该 fail 的……本着小白的「一定是我的问题不是官方的问题」的态度,我又鼓捣了一个小时,最后放弃了,于是我提了个 issue #211 (这里贴不了url,我就只能提供编号了)。过了大概两个多小时,收到了开发者的回复,的确是模板中的一个错误,把第一个 属性改成 就可以了……开发者也里可提交了一个 commit, 增加了相关的 tips,效率没得说。

表创建完成后,就开始尝试 CRUD 了,结果又遇到了问题。第一个是关于主键自增的问题,模型绑定中的属性可以是 Optional 也可以是非 Optional 的,对于非 Optional 的属性就必须提供一个初始值了,这是 Swift 的一个常识性特性。但是,如果你在模型中声明了一个非 Optional 的字段作为主键,而且设置了自动自增的约束,那么除非在插入前修改这个字段的值,不然的话就会因为主键重复 crash,错误信息就是 。而如果在插入前修改了主键的值,那就不是自动自增了……

所以,想要主键自增,第一个方法就是将自定义的主键声明为 Optional 并在约束里设置成自增,这样 WCDB 会自动给其赋值。第二个方法严格地来说并不是主键自增,而是计数自增。官方文档里有这么一句:

若类只会使用自增的方式插入,而不需要指定值的方式插入,可以在定义时直接设置 isAutoIncrement 为 true。如:var isAutoIncrement: Bool { return true }

也就是在模型里把这个属性设置为 true,就会实现自增,但是,这不是主键自增,而改变的是模型中另外一个属性。一开始我以为如果没声明主键的话,WCDB 会默认偷偷添加一个作为主键的属性呢,但是我看了源码后发现事实并不是这样的,如果约束里没有设置主键的话……那就没有主键了:

而如果模型中的 isAutoIncrement 设为 true 的话,就会在插入的时候改变 lastInsertedRowID 这个属性的值:

而如果没设置这两个属性的话,那么 lastInsertedRowID 的值始终是 Int64.min,也就是 -9223372036854775808。 那如果将一个非整型的字段设为自增主键会发生什么呢?答案很简单:

Message:AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY"

除此之外,遇到的第二个问题,就是在 query 的时候也总是 crash,原因有两方面:

Xcode 的代码提示垃圾

自己没有深究 API 文档 更多的细节就不赘述了,还是自己不仔细。

不过剩下的删除和更新按照官方文档都顺利地成功了,具体代码我就不贴了,就贴个打印的 log 吧。

总结

更多更复杂的设置和操作我都没做,至于效率我就更是没有做什么测试了,不过效率不是我最关心的,我最在意的还是易用性和稳定性。一个观察,不一定对,WCDB 一开始是个 Objective-C 的项目,所以这个语言的教程文档是最全的,而 Swift 稍逊一筹但也不错,至于 Android 的就少的可怜了,而 API Reference 方面都缺少示例,缺乏对整体架构的介绍,还有很多细节还需完善。而英文文档实在是太少了,可能也是因为刚刚公开不久,严重影响走向世界大舞台的步伐啊~。至于能不能应用到正式开发环境中,我再观察观察……

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180105G0V9CL00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券