JsonDB 1.0.1

JsonDB 1.0.1

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2016年4月

Pierre-David Bélanger 维护。



JsonDB 1.0.1

  • Pierre-David Bélanger

Dependency Status

JsonDB 是一个用于在 OS X (10.7+) 和 iOS (5.0+) 上存储、查询和处理 JSON 文档的进程内简单数据库。它基于卓越的 FMDB 构建,这是一个围绕 SQLite 的 Objective-C 包装器。

该项目始于一个小型的私有辅助库,在一个玩具 OS X 项目中,我需要一个缓存和查询大量 JSON 文档。该库逐渐发展成为一个可重用的独立项目。

我想将其作为开源项目发布,因为我认为它可以对其他人有用,同时也可以让我学会如何创建和维护 Pod、使用 Travis CI 以及 SpectaExpecta

我希望您喜欢这个项目。

稳定性

1.0.0 版本开始,这个库应该相当稳定,对 API(以及存储模式)的更改将通过 语义版本化 反映。

JsonDB 使用 Objective-C 编写并设计,但也可以与 Swift 配合使用,您只需在 Bridging Header 中添加 #import "JsonDB.h" 即可。尽管如此,从 Swift 调用 API 仍然是一团糟,对此有一些帮助将非常受欢迎。

入门

尝试 演示应用

或者 安装 库,然后遵循示例 使用

文档 将很快完成

架构

TL;DR: 如果您只阅读代码,请参阅 使用 部分 :)

JsonDB 的入口点是 JDBDatabase。您创建一个 JDBDatabase 实例,并指定要持久化数据到文件还是仅在内存中。

有了 JDBDatabase 实例,您就可以得到一个命名的 JDBCollection,它是一组文档的集合(您可以将 JDBCollection 视为一个 SQL 表)。

有了 JDBCollection,您可以插入和更新文档。您还可以创建一个 JDBView,它是一组可查询的 JSON 路径的子集(您可以将 JDBView 视为一个 SQL 视图)。

您还可以直接查询 JDBCollection,在这种情况下,将为您动态创建一个 JDBView,针对您的查询条件和排序描述符进行定制。

有了 JDBCollectionJDBView,您可以指定查询条件和排序描述符来创建一个 JDBQuery

无论哪种方式,都会创建一个 JDBQuery(可以将 JDBQuery 视为一种 SQL 预处理语句)。有了 JDBQuery,您可以只检索第一份文档或带有可选的 NSRange 和/或投影的文档。您还可以(事务性地)批量删除和修改文档。

最后,在 JsonDB 中,文档可以是与 NSJSONSerialization 兼容的对象图,顶级对象为 NSDictionary

演示

演示应用程序是一个通用的数据库浏览器。它可以允许您创建/列出集合,从 URL 导入 JSON 文档,创建/保存/列出/执行查询,创建/保存/列出文档。

要运行演示应用程序

使用 pod try

在终端中,只需执行

$ pod try JsonDB

然后在 Xcode 中运行名为 JsonDB-Demo-iOS 的目标。

使用 git clone

克隆仓库并从 JsonDB-Tests 目录运行 pod install

$ git clone https://github.com/pierredavidbelanger/JsonDB.git
$ cd JsonDB/JsonDB-Tests
$ pod install

打开工作区

$ open JsonDB-Tests.xcworkspace

然后在 Xcode 中运行名为 JsonDB-Demo-iOS 的目标。

安装

手动

下载 并解压项目。您需要的每个文件都在 JsonDB 目录下。但是,您还需要手动安装这些 依赖项

导入

将 pod(或安装库)添加到项目中后,只需导入即可

#import "JsonDB.h"

并按照 使用方式 的示例执行。

要求

JsonDB 需要 OS X(10.7+)或 iOS(5.0+)。

它还需要 FMDB,如果您使用 CocoaPods,则会自动安装(您没错吧?)。

使用方法

在指定路径上打开数据库(在此处,在 iOS 上,如果不存在,将在应用程序的文档目录中创建 main.jsondb

NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"/main.jsondb"];
JDBDatabase *database = [JDBDatabase databaseAtPath:dbPath];

获取文档集合(如果不存在,将动态创建)

JDBCollection *collection = [database collection:@"GameScore"];

将无架构的文档插入到集合中(由于它们没有,每个文档将自动生成一个 id)

[collection save:@{@"playerName": @"Sean Plott", @"score": @1337, @"cheatMode": @NO}];
[collection save:@{@"playerName": @"John Smith", @"score": @9001, @"cheatMode": @NO}];
[collection save:@{@"playerName": @"John Appleseed", @"score": @1234, @"cheatMode": @YES}];

找出谁在作弊(这将返回一个文档数组)

NSArray *cheaters = [[collection find:@{@"cheatMode": @YES}] all];
expect(cheaters).to.haveCountOf(1);
expect(cheaters[0][@"playerName"]).to.equal(@"John Appleseed");

找出名为 John 的玩家,并按字母顺序排序

NSArray *johns = [[collection find:@{@"playerName": @{@"$like": @"John %"}} sort:@[@"playerName"]] all];
expect(johns).to.haveCountOf(2);
expect(johns[0][@"playerName"]).to.equal(@"John Appleseed");

找出第一个分数超过 9000 的玩家,将其标记为作弊者并返回旧文档

NSDictionary *over9000 = [[collection find:@{@"score": @{@"$gt": @9000}}] firstAndModify:^JDBModifyOperation(NSMutableDictionary *document) {
    document[@"cheatMode"] = @YES;
    return JDBModifyOperationUpdate | JDBModifyOperationReturnOld;
}];
expect(over9000[@"cheatMode"]).to.equal(NO);

作者

Pierre-David Bélanger, [email protected]

许可证

JsonDB 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。