美文网首页技术流ios
iOS上使用levelDB

iOS上使用levelDB

作者: 每天多一点 | 来源:发表于2017-07-17 20:39 被阅读142次

概要

levelDB是谷歌开发的kv数据库, 其用C++编写, 使用范围较广. 目前在iOS平台上也有应用. levelDB采用了延迟写入的技术, 所以写入速度比较快. 官方数据如下:


我个人简单的写入测试了一下, 在iOS平台上同样的硬件设备,
确实比sqlite要快很多. 本文主要介绍在iOS平台上的如何使用levelDB.

编译

  • 首先下载源代码
git clone https://github.com/google/leveldb.git
  • 编译
cd leveldb
CXXFLAGS=-stdlib=libc++ make PLATFORM=IOS

注意, 如果系统提示权限问题, 请切换到root下或者使用sudo来执行编译命令

加入工程

编译会生成两个 .a 文件, 需要我们添加到项目工程中.


image.png

同时, 不要忘记加入头文件

image.png

注意, 这里有两个文件比较特殊: THLevelDB.h和THLeveDB.mm. 这两个文件是参考一篇博文轻量级的KV数据库LevelDB在Objective-C上的应用提供的封装.
曾静将这个封装和leveDB的头文件和编译后的.a文件进行了统合, 可以使用这个repo. 如果是cocoapods, 可以直接引入.

用法

  • 取得实例
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *pageDBPath = [docPath stringByAppendingPathComponent:@"my_leveldb.db"];
THLevelDB *myLevelDB = [THLevelDB levelDBWithPath:pageDBPath];

注意, 数据库文件必须是 *.db 的形式

NSString *key = [NSString stringWithFormat:@"%lld", a];
[myLevelDB setString:@"hello world" forKey:key];

注意, 这里key值必须是一个String

NSString *str = [myLevelDB stringForKey:@"somekey"]; //根据key取得对应值
NSArray *keys = [myLevelDB allKeys]; //取得所有的key

改变排序

levelDB提供了方法可以改变key值在数据库中的排序. 这里需要实现一个比较用的方法类, 同时在数据库实例初始化的时候加入加进去.

假设我们的key是一个long long的数值的字符串. 我们想每次加入key时, 都能有序的在数据中保存.

  • 首先实现比较用的方法类

在THLevelDB.mm文件中, 添加

class TwoPartComparator : public leveldb::Comparator {

public:
    // Positive
    int Compare(const leveldb::Slice& a, const leveldb::Slice& b) const {
        long long v1 = atoll(a.data());
        long long v2 = atoll(b.data());

        if (v1 < v2) return -1;
        if (v1 > v2) return +1;
        return 0;
    }

    // Ignore the following methods for now:
    const char* Name() const { return "TwoPartComparator"; }
    void FindShortestSeparator(std::string*, const leveldb::Slice&) const {}
    void FindShortSuccessor(std::string*) const {}
};
  • 在interface中增加这个比较的类的对象
@interface THLevelDB ()
{
    leveldb::DB *_db;
    leveldb::ReadOptions _readOptions;
    leveldb::WriteOptions _writeOptions;
    NSString *_path;
    TwoPartComparator _cmp; //这一行是增加的
}

注意, 这一步比较关键, 因为这个方法类需要一直能够在内存中存在以便于数据库实例去调用, 所以我们必须要放在这里.

  • 初始化的时候将这个方法类传入
- (id)initWithPath:(NSString *)path
{
    self = [super init];
    if (self)
    {
        _path = path;
        leveldb::Options options;
        options.create_if_missing = true;
        options.comparator = &_cmp; //将这个方法类的实例地址传入

        if (![[NSFileManager defaultManager] fileExistsAtPath:_path])
        ...

参考

本文主要参考了

相关文章

  • iOS上使用levelDB

    概要 levelDB是谷歌开发的kv数据库, 其用C++编写, 使用范围较广. 目前在iOS平台上也有应用. le...

  • LevelDB与RocksDB的区别

    RocksDB是在LevelDB的基础上优化而来。 Features Not in LevelDB · faceb...

  • [reprinted]leveldb

    leveldb 是一个著名的key-value数据库 如何使用 leveldb key, value可以是任意的字...

  • LevelDB:使用介绍

    LevelDB 提供的接口其实很简单,下面举例进行简单说明。 例子 这个例子简单介绍了 LevelDB 的基本用法...

  • 使用leveldb模块

    LevelDB是谷歌开源的一个键值数据库,速度非常快,同时自动压缩数据。 起因是直接写入文本不方便第二次查找;写入...

  • iOS上如何使用iconfont图标

    iOS上如何使用iconfont图标 iOS上如何使用iconfont图标

  • LevelDB:读操作

    前面写了两篇文章介绍 LevelDB 的整体架构和接口使用。这篇文章,我们从代码的角度看看 LevelDB 的设计...

  • Frida官方手册 - 在iOS上使用Frida

    在 iOS 上使用 Frida 在 iOS 设备上,Frida 支持两种使用模式,具体使用哪种模式要看你的 iOS...

  • levelDB以及goleveldb初步学习

    LevelDB介绍: 官网:http://leveldb.org/ levelDB是Google开源的KeyVal...

  • [LevelDB]状态类的设计

    [LevelDB]状态类的设计.md LevelDB的状态类是leveldb::Status,以下简称Status...

网友评论

    本文标题:iOS上使用levelDB

    本文链接:https://www.haomeiwen.com/subject/rfpqkxtx.html