CDTDatastore 2.1.1

CDTDatastore 2.1.1

测试已测试
语言语言 Obj-CObjective C
许可证 Apache-2.0
发布上次发布2018年9月

Mike RhodesRhys Short维护。



  • Cloudant, Inc.

CDTDatastore

Version Platform Build Status

应用程序使用Cloudant Sync在设备上存储、索引和查询本地JSON数据,并在多台设备之间同步数据。同步由应用程序控制,而不是由底层系统控制。冲突也易于管理和解决,无论是在本地设备还是远程数据库中。

Cloudant Sync是一个与Apache CouchDB™复制协议兼容的数据存储,用于那些不需要或不需要运行完整CouchDB实例的设备。它由Cloudant构建,许多人的工作成果,并受Apache 2.0许可证约束。

API与CouchDB的API相当不同;我们保留了MVCC数据模型,但没有HTTP为中心的API。

此库适用于iOS,还有一个Android版本

如果您有疑问,请加入我们的邮件列表并给我们留言。

在您的项目中使用

CDTDatastore可以通过CocoaPods使用,为了安装它,请将以下行添加到您的Podfile中:

pod "CDTDatastore"

注意:我们只支持在最新稳定版本的Xcode上构建。

在Swift应用中使用

CDTDatastore可以不加修饰地从Swift中使用,但有一些小问题。按照以上说明进行安装,并将CloudantSync.h导入到您的桥接头中。

下面的概述部分包含Objective-C和Swift的示例。

示例项目

示例项目位于“Project”文件夹中,适用于iOS 7。要独立于主代码库运行,Podfile中包含了Podfile文件。

$ cd Project
$ pod install
$ open Project.xcworkspace

为了运行示例项目,修改位于CDTViewController.m中的URL定义:在replicatorURL中。将此更改为您自己的账户和数据库的凭据,确保您有_reader_writer_replicator权限。

运行后,您将能够编辑应用程序和您的Cloudant数据库中的“待办事项”项,并同时将这些更改复制到两个方向。

运行测试

参见贡献指南

已测试的平台

CDTDatastore定期在以下平台上进行测试

  • OS X 10.11 (El Captain)
  • iPhone 4S(模拟器),iOS 9.2

库概述

将库添加到项目后,添加和读取文档的基本方法是

#import <CloudantSync.h>

// Create a CDTDatastoreManager using application internal storage path
NSError *outError = nil;
NSFileManager *fileManager= [NSFileManager defaultManager];

NSURL *documentsDir = [[fileManager URLsForDirectory:NSDocumentDirectory
                                           inDomains:NSUserDomainMask] lastObject];
NSURL *storeURL = [documentsDir URLByAppendingPathComponent:@"cloudant-sync-datastore"];
NSString *path = [storeURL path];

CDTDatastoreManager *manager =
[[CDTDatastoreManager alloc] initWithDirectory:path
                                         error:&outError];

CDTDatastore *datastore = [manager datastoreNamed:@"my_datastore"
                                            error:&outError];

// Create a document
CDTDocumentRevision *rev = [CDTDocumentRevision revisionWithDocId:@"doc1"];
// Use [CDTDocumentRevision revision] to get an ID generated for you on saving
rev.body = [@{
    @"description": @"Buy milk",
    @"completed": @NO,
    @"type": @"com.cloudant.sync.example.task"
} mutableCopy];

// Add an attachment -- binary data like a JPEG
CDTUnsavedFileAttachment *att1 = [[CDTUnsavedFileAttachment alloc]
                          initWithPath:@"/path/to/image.jpg"
                          name:@"cute_cat.jpg"
                          type:@"image/jpeg"];
rev.attachments[att1.name] = att;

// Save the document to the database
CDTDocumentRevision *revision = [datastore createDocumentFromRevision:rev
                                                                error:&error];
// `revision` will be `nil` on failures.

// Read a document
NSString *docId = revision.docId;
CDTDocumentRevision *retrieved = [datastore getDocumentWithId:docId
                                                        error:&error];

如果您使用Swift,按照以上说明安装库,并将use_frameworks!指令添加到您的目标中。如果未使用use_frameworks!指令,则需要桥接头。

如果您使用桥接头,则需要包含CloudantSync.h,您就可以正常运行了

#import <CDTDatastore/CloudantSync.h>

要在Swift中添加和读取文档,基本操作如下

import CDTDatastore

do {
    let fileManager = FileManager.default

    let documentsDir = fileManager.urls(for: .documentDirectory, in: .userDomainMask).last!

    let storeURL = documentsDir.appendingPathComponent("cloudant-sync-datastore")
    let path = storeURL.path

    let manager = try CDTDatastoreManager(directory: path)
    let datastore = try manager.datastoreNamed("my_datastore")

    // Create a document
    let rev = CDTDocumentRevision(docId: "doc1")
    rev.body = ["description":"Buy Milk",
                "completed": false,
                "type":"com.cloudant.sync.example.task"]

    // Add an attachment - binary data like a JPEG
    let att1 = CDTUnsavedFileAttachment(path: "/path/to/image/jpg",
                                        name: "cute_cat.jpg",
                                        type: "image/jpeg")!
    rev.attachments[att1.name] = att1

    let revision = try datastore.createDocument(from: rev)

    // Read a document
    let docId = revision.docId
    let retrieved = try datastore.getDocumentWithId(docId!)

} catch {
    print("Encountered an error: \(error)")
}

更多内容请参阅CRUD文档

您可以订阅数据库变化的通知,这将在事件文档中描述。目前还是相当原始

  • 您会收到所有新修订的复制通知(可能每个更新的文档不止一个)。

在多台设备之间复制数据

复制用于在本地数据存储和远程数据库(一个CouchDB实例或Cloudant数据库)之间同步数据。许多数据存储可以使用同一远程数据库进行复制,这意味着通过从每台设备设置复制到远程数据库来实现跨设备同步。

在常见情况下,复制很容易开始

#import <CloudantSync.h>

// Create and start the replicator -- -start is essential!
CDTReplicatorFactory *replicatorFactory =
[[CDTReplicatorFactory alloc] initWithDatastoreManager:manager];

NSString *s = @"https://apikey:[email protected]/my_database";
NSURL *remoteDatabaseURL = [NSURL URLWithString:s];
CDTDatastore *datastore = [manager datastoreNamed:@"my_datastore"];

// Replicate from the local to remote database
CDTPushReplication *pushReplication = [CDTPushReplication replicationWithSource:datastore
                                                                         target:remoteDatabaseURL];
NSError *error;
CDTReplicator *replicator = [replicatorFactory oneWay:pushReplication error:&error];

//check error

// Start the replicator
[replicator start];
import CDTDatastore
do {

    let datastore = try manager.datastoreNamed("my_datastore");

    // Replicate from the local to remote database
    let remote = URL(string: "https://apikey:[email protected]/my_database")!
    datastore.push(to: remote) { error in

        if let error = error {
            print("Encountered an error: \(error)")
        } else {
            print("Replication complete")
        }

    }

} catch {
    print("Encountered an error: \(error)")
}

更多内容请参阅复制文档,包括如何使用IAM身份验证代替用户名/密码。

查找数据

一旦数据库中有成千上万的文档,就很重要需要有有效的方式去查找它们。我们已经添加了一个易于使用的查询API。一旦设置适当的索引,查询如下

NSDictionary *query = @{
    @"name": @"John",         // name equals John
    @"age": @{ @"$gt" : @25}  // age greater than 25
};
CDTQResultSet *result = [datastore find:query];
[result enumerateObjectsUsingBlock:^(CDTDocumentRevision *rev, NSUInteger idx, BOOL *stop) {
    // do something
}];
let query = [
    "name" : "John", // name equals John
    "age" : ["$gt" : 25] // age greater than 25
]
let result = datastore.find(query)
result?.enumerateObjects { rev, idx, stop in
    // do something
}

请参阅索引和查询数据

从版本0.16.0开始,索引和查询代码已被重写,并且比之前的实现具有更多功能。有关如何从先前的版本迁移到0.16.0+索引和查询版本的详细信息,请参阅索引和查询迁移

冲突

能够复制的文档在多个位置编辑是很常见的,这可能会导致同时在多个地方编辑同一文档。当包含这些并发编辑的数据库进行复制时,需要某种方法将这些不同的文档恢复在一起。Cloudant的MVCC数据模型用于此目的。

文档实际上是一个文档及其历史的树。这很方便,因为它允许我们存储文档的多个版本。主要来说,有一个单一、线性的树——只是一根枝条——从文档的创建到当前版本延伸。然而,你也可以在树中创建更多分支。这时,你的文档可能会有冲突,需要一些手术来解决问题,恢复其完整健康。

需求

所有需求均包含在源代码中,或通过pod install作为依赖项拉入。

贡献者

请参阅贡献者

为项目做出贡献

参见贡献指南

许可证

请参阅LICENSE

CDTDatastore类和TouchDB类

根据Apache许可证2.0版本(以下简称“许可证”);除非法律要求或书面同意,否则不得使用此文件,除非符合许可证。您可以在以下地址获取许可证副本:

https://apache.ac.cn/licenses/LICENSE-2.0

除非法律规定或书面同意,否则根据许可证分发的软件按“现状”基础分发,不包括任何明示或暗示的保证或条件。有关许可证中规定的管理水平权限和限制的具体语言,请参阅许可证。

在不同许可证下的使用库

  • MYUtilities遵循BSD许可证(部分已复制到供应商目录)。
  • FMDB由Gus Mueller开发,遵循MIT许可证。
  • Google Toolbox For Mac遵循Apache License 2.0。