CDTDatastore
应用程序使用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。