测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布最后发布 | 2016年6月 |
由 Janos Tolgyesi,Paolo Bellucci 维护。
NSPDynamoStore
是 NSIncrementalStore 的子类,允许无缝地将 Amazon DynamoDB 支持的数据库集成到 Core Data 框架中。
本章简要介绍了 Core Data。如果您已经熟悉 Core Data 栈的架构,了解对象故障、托管对象上下文、持久存储以及持久存储协调器的概念,可以自由跳过此章。
"Core Data 是苹果在 Mac OS X 和 iOS 操作系统中提供的对象图和持久框架。"(《维基百科》)Core Data 通过一个称为 对象故障 的概念来帮助对象生命周期和对象图管理。故障对象是尚未加载到内存中的数据对象的占位符,原因是为了节省内存或检索对象的成本很高(涉及磁盘或网络请求),因此采用了懒加载。
Core Data 是 iOS 和 OS X 开发者熟知的技术,因为它自带了对 SQLite 存储的数据存储的支持,因此它是存储设备上结构化、面向对象数据的最简单解决方案之一。从这个角度来看,Core Data 是在 SQLite 上的对象关系映射器。
Core Data 具有类似堆栈的架构
NSPDynamoStore
的例子中,所有数据对象都来自同一个来源(DynamoDB),因此一个应用程序中通常需要一个持久存储和一个持久存储协调器。从 iOS 5.0 和 OS X 10.7 开始,Apple 引入了实现持久化存储子类的可能性,从而可以将获取远程或本地数据的逻辑封装在 Core Data 栈中。实际上,文档提到了使用远程网络服务作为持久化存储的情况。
有关更多信息,请参阅Core Data 编程指南和增量存储编程指南。
Amazon DynamoDB 是 Amazon.com 提供的一项完全托管型 NoSQL 数据库服务,是亚马逊网络服务套件的一部分。可以访问构成 AWS 部分的网络服务进行数据库操作。有关更多信息,请访问Amazon DynamoDB 主页。
NSPDynamoStore
?NSPDynamoStore
是一种持久化存储实现,它使用 Amazon DynamoDB 作为后端数据存储。为了访问存储在 DynamoDB 中的数据,需要互联网连接和配置了 DynamoDB 服务访问。
遵循AWS DynamoDB SDK for iOS 入门指南中的步骤,从您的应用中设置 DynamoDB 访问。您不需要设置对象映射器客户端或定义映射类,只需设置一个示例 DynamoDB 表。
创建一个 AWSServiceConfiguration
后,使用您自己的密钥注册一个 AWSDynamoDB
实例
AWSServiceConfiguration *configuration = …
[AWSDynamoDB registerDynamoDBWithConfiguration:configuration forKey:@"your_dynamodb_key"];
在 Xcode 的 托管对象模型编辑器 中创建 Core Data 托管对象模型。如果您不确定如何操作,请遵循网络上可用的众多教程之一,例如在 Ray Wenderlich 网站上的教程。
我们建议您使用 DynamoDB 表名称 作为 Core Data 实体名称,但这不是强制的。但是,如果使用不同的名称,您应如后所述配置托管对象模型中的 DynamoDB 表名称。对 Core Data 实体的属性名称也是如此:如果它们与 DynamoDB 表的列键相匹配,则 NSPDynamoStore
将自动识别它们;否则,您应在托管对象模型中定义 DynamoDB 表键。
目前支持以下属性类型
Core Data 属性类型 | DynamoDB 类型 |
---|---|
字符串 | 字符串 |
数字类型 | 数字 |
一对一关系 | 字符串或数字 |
多对多关系 | 字符串集或数字集 |
在一对一关系中,用于键的DynamoDB表应存储目标对象的Primary Hash Key值。在多对一关系中,用于键的DynamoDB表应存储包含目标对象Primary Hash Key值的集合。
Primary Hash Key
在托管对象模型编辑器中选择一个实体,然后在实用工具面板中选择数据模型检查器(Alt+Cmd+3)。创建一个名为NSPDynamoStoreEntityHashKeyAttributeName
的新用户信息键,其值为关联的DynamoDB表的Primary Hash Key名称。
为每个实体定义Primary Hash Key属性名称是强制性的。
DynamoDB表名称
如果您为您的Core Data实体和DynamoDB表使用了不同的名称,则应将DynamoDB表名称通知给Core Data实体。为实体定义一个名为NSPDynamoStoreEntityDynamoDBTableName
的新用户信息键,其值为您的DynamoDB表中表的名称。
如果您使用了与Core Data实体相同的名称作为DynamoDB表名称,则此步骤不是必需的。
DynamoDB数据键名称
如果您为Core Data实体的属性和用于相应DynamoDB表的数据键使用了不同的名称,则应将DynamoDB键名称通知给Core Data实体。选择实体属性,并添加一个新的用户信息键,其名称为NSPDynamoStoreAttributeName
,其值为DynamoDB表中键的名称。
如果您使用了与DynamoDB表中相应数据对象键相同的名称来作为Core Data属性,则此步骤不是必需的。
使用Xcode(选择编辑 -> 创建NSManagedObject子类)或mogenerator
(与创建标准SQLite支持的Core Data堆栈类似的方式)为您的模型创建托管对象子类。
为您的应用程序设置NSManagedObjectModel
、NSPersistentStoreCoordinator
和NSManagedObjectContext
实例。如果您在创建Xcode项目时选择了“使用Core Data”,则为您自动完成。使用NSPrivateQueueConcurrencyType
初始化您的NSManagedObjectContext
。
self.managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
向协调器添加持久化存储时,将持久化存储类型从NSSQLiteStoreType
替换为[NSPDynamoStore storeType]
。在选项字典中指定您的AWSDynamoDB
实例密钥的NSPDynamoStoreDynamoDBKey
。
NSDictionary *options = @{ NSPDynamoStoreDynamoDBKey : @"your_dynamodb_key" };
[self.persistentStoreCoordinator addPersistentStoreWithType:[NSPDynamoStore storeType]
configuration:nil
URL:nil
options:options
error:nil];
此时,您可以使用标准Core Data方法对DynamoDB表进行fetch请求。
NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MyEntity"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name == %@", @"someValue"];
[self.managedObjectContext performBlock:^{
NSArray* results = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
id firstItem = [results firstObject];
NSLog(@"%@", [firstItem valueForKey:@"name"]);
}
}];
NSPDynamoPersistentStore
同步执行请求,因为Core Data就是这样要求的。由于执行请求涉及网络通信,建议您创建一个NSPrivateQueueConcurrencyType
的托管对象上下文,并在上下文的背景队列上执行请求。
当前,NSPDynamoPersistentStore
仅支持一组严格包含的谓词运算符,包括<、<=、==、>=、>、BEGINSWITH、CONTAINS、BETWEEN和IN。它支持ANDed或ORed的复合谓词,但不能混合。