NSPDynamoStore 0.0.5

NSPDynamoStore 0.0.5

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2016年6月

Janos TolgyesiPaolo Bellucci 维护。



  • Janos Tolgyesi

NSPDynamoStoreNSIncrementalStore 的子类,允许无缝地将 Amazon DynamoDB 支持的数据库集成到 Core Data 框架中。

简介

什么是 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 DynamoDB 是 Amazon.com 提供的一项完全托管型 NoSQL 数据库服务,是亚马逊网络服务套件的一部分。可以访问构成 AWS 部分的网络服务进行数据库操作。有关更多信息,请访问Amazon DynamoDB 主页

什么是 NSPDynamoStore

NSPDynamoStore 是一种持久化存储实现,它使用 Amazon DynamoDB 作为后端数据存储。为了访问存储在 DynamoDB 中的数据,需要互联网连接和配置了 DynamoDB 服务访问。

入门指南

设置 DynamoDB 客户端

遵循AWS DynamoDB SDK for iOS 入门指南中的步骤,从您的应用中设置 DynamoDB 访问。您不需要设置对象映射器客户端或定义映射类,只需设置一个示例 DynamoDB 表。

创建一个 AWSServiceConfiguration 后,使用您自己的密钥注册一个 AWSDynamoDB 实例

AWSServiceConfiguration *configuration = …
[AWSDynamoDB registerDynamoDBWithConfiguration:configuration forKey:@"your_dynamodb_key"];

创建 Core Data 托管对象模型

在 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值的集合。

在托管对象模型中定义附加的DynamoDB元数据

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堆栈类似的方式)为您的模型创建托管对象子类。

设置Core Data堆栈

为您的应用程序设置NSManagedObjectModelNSPersistentStoreCoordinatorNSManagedObjectContext实例。如果您在创建Xcode项目时选择了“使用Core Data”,则为您自动完成。使用NSPrivateQueueConcurrencyType初始化您的NSManagedObjectContext

self.managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

将持久化存储协调器更改为NSPDynamoStore

向协调器添加持久化存储时,将持久化存储类型从NSSQLiteStoreType替换为[NSPDynamoStore storeType]。在选项字典中指定您的AWSDynamoDB实例密钥的NSPDynamoStoreDynamoDBKey

NSDictionary *options = @{ NSPDynamoStoreDynamoDBKey : @"your_dynamodb_key" };
[self.persistentStoreCoordinator addPersistentStoreWithType:[NSPDynamoStore storeType]
                                              configuration:nil
                                                        URL:nil
                                                    options:options
                                                      error:nil];

制作一个fetch请求

此时,您可以使用标准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的复合谓词,但不能混合。