文章目录
  1. 1. 编译iOS静态库
  2. 2. 在iOS中使用LevelDB
    1. 2.1. 步骤一:导入相关文件
    2. 2.2. 步骤二:添加 -fno-objc-arc 标签
    3. 2.3. 步骤三:添加 Header Search Paths
    4. 2.4. 步骤四:添加 libc++.dylib Framework
    5. 2.5. 如何使用Objective-LevelDB

LevelDB是Google公司重量级工程师Jeff Dean和Sanjay Ghemawat发起的开源项目。LevelDB是一个持久化存储的KV系统,和Redis这种内存型的KV系统不同,LevelDB不会像Redis一样狂吃内存,而是将大部分数据存储到磁盘上。目前能够支持billion级别的数据量,在这个数量级别下还有着非常高的性能,主要归功于它的良好的设计。

LevelDB开源并托管在GitHub上,项目的地址是:https://github.com/google/leveldb

有个来自LevelDB官方对LevelDB、TreeDB和SQLite3进行性能对比分析的测试,测试结果如下图所示:

结果显示,在顺序读写和随机写上,LevelDB 在性能上都遥遥领先。

编译iOS静态库

1.下载代码到本地

1
git clone https://github.com/google/leveldb.git

2.编译项目代码

1
2
cd leveldb
CXXFLAGS=-stdlib=libc++ make PLATFORM=IO

如果出现如下报错信息:

1
2
3
4
c++ -stdlib=libc++ -I. -I./include -std=c++0x -DOS_MACOSX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/builder.cc -o /db/builder.o
error: unable to open output file '/db/builder.o': 'Operation not permitted'
1 error generated.
make: *** [/db/builder.o] Error 1

使用 sudo CXXFLAGS=-stdlib=libc++ make PLATFORM=IOS 这行命令即可。

说明:

(1)编译完成之后在 out-ios-universal 这个目录下面会自动生成 libleveldb.alibmemenv.a 两个文件。

(2)可以用 lipo -info libleveldb.a 检测生成的静态库支持的架构情况。默认支持 armv6 armv7 armv7s i386 x86_64 arm64 所有的架构

(3)头文件在include目录下面,后面会用到

在iOS中使用LevelDB

LevelDB提供的是C++的API,可以在 https://rawgit.com/google/leveldb/master/doc/index.html 这里查到具体的使用说明。

使用C++确实是不太方便,不过已经有开源库将这些接口使用Objective-C进行了一下包装:Objective-LevelDB

Objective-LevelDB 里面没有提供编译好的 .a 文件,我就拉取最新的代码编译好了.a文件并写了一个 DEMO

下面记录下如何使用:

步骤一:导入相关文件

LevelDB 整个文件夹拷贝到需要添加到的项目中

步骤二:添加 -fno-objc-arc 标签

打开 Target -> Build Phases -> Compile Sources 找到 LevelDB.mm、LDBSnapshot.mm、LDBWriteBatch.mm 这3个文件

然后加入 -fno-objc-arc 标签。


步骤三:添加 Header Search Paths

打开 Target -> Build Settings -> Header Search Paths 加入 LevelDB文件夹在项目中的路径。

参考:$(PROJECT_DIR)/USLevelDB/LevelDB


步骤四:添加 libc++.dylib Framework

打开 Target -> General -> Linked Frameworks and Libraries

然后在工程中链接上 libc++.dylib

如何使用Objective-LevelDB

开源库的使用文档:https://github.com/matehat/Objective-LevelDB#how-to-use