今天公司项目需要用到数据库功能,之前一直用FMDB,后来看过关于WCDB的介绍,就想用WCDB试试手,然鹅集成并不顺利,下面说下遇到的坑。
官方提供了3种集成方式:(直接复制github,用斜体表示,参考链接:https://github.com/Tencent/wcdb/wiki)
1.通过Carthage安装:
先安装Carthage;
在Cartfile中添加 github "Tencent/WCDB",并执行carthage update;
将Carthage/Build/目录下iOS或Mac的WCDB.framework添加到你的项目工程配置的Build Phases->Linked Binary and Libraries中。
点击你的项目工程配置的Build Phases中的+选项,在弹出菜单中选择New Run Script Phase。在创建的脚本中添加 carthage copy-frameworks ,并在Input Files中添加对应平台的路径$(SRCROOT)/Carthage/Build/iOS/WCDB.framework 或 $(SRCROOT)/Carthage/Build/Mac/WCDB.framework。
在你的代码文件头引入头文件#import 。
由于WCDB是基于Objective-C++,因此需要将引用WCDB的源文件后缀.m改为.mm。
2.通过cocoapods安装:
先安装Cocoapods;
通过 pod repo update 更新WCDB的cocoapods版本。
在Podfile对应的target中,添加pod 'WCDB',并执行pod install --verbose。
在项目中使用CocoaPods生成的.xcworkspace运行工程。
在你的代码文件头引入头文件#import 。
由于WCDB是基于Objective-C++,因此需要将引用WCDB的源文件后缀.m改为.mm。
通过动态库安装: 动态库与iOS 7不兼容,因此需支持iOS 7的需要通过静态库安装。
获取WCDB源码,并更新sqlcipher的submodule。
git clone https://github.com/Tencent/wcdb.git
cd wcdb
git submodule update --init sqlcipher
将WCDB.xcodeproj添加到你的工程中.
在你的项目工程配置的General->Enbedded Binaries中添加WCDB.framework。注意这里有两个WCDB.framework,要选择动态库那个。选完后可在Build Phases->Target Dependencies中确认,若为WCDB则正确,而WCDB iOS Static则是静态库使用的。
在你的代码文件头引入头文件#import 。
由于WCDB是基于Objective-C++,因此需要将引用WCDB的源文件后缀.m改为.mm。
3.通过静态库安装:
获取WCDB源码,并更新sqlcipher的submodule。
git clone https://github.com/Tencent/wcdb.git
cd wcdb
git submodule update --init sqlcipher
将WCDB.xcodeproj添加到你的工程中.
在你的项目工程配置的Build Phases->Target Dependencies中添加WCDB iOS Static.framework。
在你的项目工程配置的Build Phases->Linked Binary and Libraries中添加WCDB.framework和libz.tbd。注意,这里有两个WCDB.framework,需要添加WCDB iOS Static的target下的WCDB.framework。
在你的项目工程配置的Build Settings->Other Linker Flags中添加-all_load和-ObjC。
在你的代码文件头引入头文件#import 。
由于WCDB是基于Objective-C++,因此需要将引用WCDB的源文件后缀.m改为.mm。
我选择的是第二种方式cocoapods安装
pod install完成,直接运行Xcode报错,错误原因为 “use of '@import' when modules are disabled,....“ 位置在引用的ProjectName-Bridging-Header.h里面的“@import Charts;” 行代码(项目里面用到了oc与swift混编“Charts 为swift代码”
解决思路:网上查找后获取到一条信息,下面是原话

大概意思是如果在cpp或.文件里引用了桥接文件modules将会自动禁用;
第一反应我的桥接文件没有放在 cpp文件也没有放在.mm文件,怎么一样报错;
后来一想,应该是桥接文件放在了.pch里面,马上将桥接文件移出只在用到的地方调用;
运行,还是报错,这次报的是"'type_traits' file not found",如图:

报错的文件在WCDB里面,这时想到是不是编译器的问题,于是将Build Settings下的 C++ Standard Library的值从libstdc++(GNU C++ standerd library) 切换到libc++(LLVM C++ standerd library with C++11 support),运行,Build Success!!!
暂时记录一下,以免后面再用的时候忘记
网友评论