AppGallery|使用Cloud DB构建APP 快速入门 - iOS篇

概述
此示例应用演示了如何快速的使用Cloud DB构建简单的图书管理服务。通过快速入门和示例应用,您将会了解到如下信息:

  • 如何使用Cloud DB进行应用开发。
  • 应用数据如何写入到Cloud DB。
  • 如何实现数据的查询。
  • 实时侦听数据的更改。
  • 体验端云数据同步等功能。
开发准备
使用Cloud DB构建应用服务,需要完成以下准备工作:
  • 您已经在开发者联盟官网注册帐号并通过实名认证,详细请参见帐号注册认证。
  • 您已经在AppGallery Connect控制台上创建项目和应用,详细请参见创建项目。
  • 示例应用使用了认证用户的相关权限,需要开通AppGallery Connect认证服务中“匿名帐号”服务,详细请参见认证服务。
  • 您已经获取到示例代码,请从示例代码获取。
  • 您已在本地安装Xcode。

启用服务 使用Cloud DB服务前,您需要先启用服务。
  1. 登录AppGallery Connect网站,选择“我的项目”。
  2. 在项目列表页面中选择项目,单击项目下需要启用云数据库服务的应用。
  3. 在导航树上选择“构建 > 云数据库”。
  4. 单击“立即开通”,开通云数据库服务。 AppGallery|使用Cloud DB构建APP 快速入门 - iOS篇
    文章图片

  5. (可选)如您还未选择数据处理位置,需要您先设置数据处理位置,具体操作请参见设置数据处理位置。 AppGallery|使用Cloud DB构建APP 快速入门 - iOS篇
    文章图片

  6. 服务初始化成功后,即启用云数据库服务成功。
新增和导出对象类型 您需要基于AppGallery Connect控制台创建对象类型,请您遵循操作步骤创建示例中涉及的对象类型,并导出Objective-C格式的对象类型文件。不允许修改导出的Objective-C格式文件,否则会导致数据同步功能异常。
  1. 登录AppGallery Connect网站,选择“我的项目”。
  2. 在项目列表页面中选择项目,单击项目下需要创建对象类型的应用。
  3. 在导航树上选择“构建 > 云数据库”。
  4. 单击“新增”,进入创建对象类型页面。 AppGallery|使用Cloud DB构建APP 快速入门 - iOS篇
    文章图片

  5. 输入对象类型名为“BookInfo”后,单击“下一步”。
  6. 单击 +新增字段,新增如下字段后,单击“下一步”。
    表1 字段定义表
    字段名称
    类型
    主键
    非空
    加密
    默认值
    id
    Integer




    bookName
    String




    author
    String




    price
    Double




    publisher
    String




    publishTime
    Date




    shadowFlag
    Boolean



    true
  7. 单击 +新增索引 ,设置索引名为“bookName”,索引字段为“bookName”后,单击“下一步”。
  8. 按照如下要求设置各角色权限后,单击“下一步”。
    表2 权限配置表
    角色
    query
    upsert
    delete
    所有人



    认证用户



    数据创建者



    管理员



  9. 单击“确定”。 创建完成后返回对象类型列表中,可以查看已创建的对象类型。
  10. 单击“导出”。 AppGallery|使用Cloud DB构建APP 快速入门 - iOS篇
    文章图片

  11. 选择导出文件格式,选择“Objective-C格式”。
  12. 单击“导出”。 文件将会导出至本地,其内包含该版本中所有的对象类型。导出的Objective-C格式文件在后续步骤用于添加至本地开发环境。
新增存储区 可基于AppGallery Connect控制台在云侧创建数据存储区,请您遵循操作步骤创建一个存储区名称为“CloudDBDemo”的存储区。
  1. 登录AppGallery Connect网站,选择“我的项目”。
  2. 在项目列表页面中选择项目,单击项目下需要创建存储区的应用。
  3. 在导航树上选择“构建 > 云数据库”。
  4. 选择“存储区”页签。
  5. 单击“新增”,进入创建存储区页面。 AppGallery|使用Cloud DB构建APP 快速入门 - iOS篇
    文章图片

  6. 输入存储区名称为“CloudDBDemo”。
  7. 单击“确定”。 创建完成后返回存储区列表中,可以查看已创建的存储区。
配置开发环境 使用CocoaPods集成SDK。
  1. 集成AGC SDK,详细请参见集成AGC SDK。
  2. 在podfile文件中添加Cloud DB SDK依赖。
    pod 'AGConnectDatabase', '~>1.0.4.300'

  3. 执行pod install,然后打开.xcworkspace文件查看该项目。
    pod install


注意:
  • 使用SQLCipher默认生成的文件权限为0644,建议将文件权限修改为0640,保证文件在使用过程中的安全性。每次pod install后,在pod工程中的“TARGETS > SQLCipher > Build Settings > Other C Flags”文件中添加“-DSQLITE_DEFAULT_FILE_PERMISSIONS=0640”。
  • Cloud DB iOS SDK依赖SQLCipher,而SQLCipher是基于SQLite开发的开源组件,由于iOS SDK并没有直接集成SQLCipher源码,所有我们无法提供已修复漏洞的SQLCipher版本。但是,我们会持续关注SQLite上的漏洞信息,当发现新的漏洞时,我们会及时分析和验证,确认漏洞可以修复时,会更新至漏洞补丁表中,您可以根据应用需要选择是否修复该漏洞,详细请参见SQLite漏洞修复。
添加对象类型文件 在开发应用时,可直接将AppGallery Connect控制台上导出的Objective-C格式文件添加至本地开发环境,并通过AGConnectCloudDB类中的createObjectType方法实现对象类型的定义和创建。在进行本地应用开发时,无需再次创建对象类型。
  1. 将已在AppGallery Connect控制台上导出的全部Objective-C格式文件添加至本地开发环境。
  2. 初始化Cloud DB,通过AGConnectCloudDB类中的createObjectType方法实现对象类型的定义和创建,详细请参见初始化。
初始化 在配置完开发环境后,就可以使用云数据库进行应用开发。开发应用时,需要先执行初始化操作,初始化AGConnectCloudDB、创建Cloud DB zone和对象类型。
  1. 通过initEnvironment方法初始化AGConnectCloudDB。
    NSError *error = nil; [AGConnectCloudDB initEnvironment:&error];

  2. 通过shareInstance方法获取AGConnectCloudDB实例,并使用createObjectType方法创建对象类型。
    self.agcConnectCloudDB = [AGConnectCloudDB shareInstance]; NSError *createError= nil; [self.agcConnectCloudDB createObjectType:[AGCCloudDBObjectTypeInfoHelper obtainObjectTypeInfo] error:&createError];


  3. 创建Cloud DB zone配置对象,并打开该Cloud DB zone(以Cloud DB zone的同步属性为缓存模式、访问属性为公共存储区为例),详细请参考AGCCloudDBZoneConfig。
    AGCCloudDBZoneConfig *zoneConfig = [[AGCCloudDBZoneConfig alloc] initWithZoneName:zoneName syncMode:AGCCloudDBZoneSyncModeCloudCache accessMode:AGCCloudDBZoneAccessModePublic]; __weak typeof(self) weakSelf = self; [self.agcConnectCloudDB openCloudDBZone2:zoneConfig allowCreate:YES callback:^(AGCCloudDBZone * _Nullable zone, NSError * _Nullable error) { weakSelf.dbZone = zone; }];


写入数据 在本节主要介绍如何在应用程序中进行数据写入操作,以便您了解如何使用Cloud DB SDK实现数据的写入。在应用界面中,增加了“添加”按钮,用于用户新增数据,并在代码中通过executeUpsert实现数据的写入。
- (void)executeUpsertWithBooks:(NSArray *__nonnull)books complete:(void(^)(BOOL success, NSError *error))complete { if (books.count == 0) { return; } [self.dbZone executeUpsert:books onCompleted:^(NSInteger count, NSError * _Nullable error) { if (error) { if (complete) { complete(NO, error); } } else { if (complete) { complete(YES, nil); } } }]; }

查看数据
获取数据变化
用户在应用界面中新增的数据,将会被存储在云侧。在端侧注册数据变化侦听器,当云侧数据发生变化时,端侧能够感知数据变化,及时刷新本地应用数据。通过查询条件与subscribeSnapshotWithQuery方法组合使用,可以指定侦听对象,当侦听对象的数据发生变化时,端侧会收到通知,根据快照获取变化的数据信息,从云侧同步数据至端侧应用。
- (void)subscribeSnapshotComplete:(void(^)(NSArray *bookList, NSError *error))complete { AGCCloudDBQuery *query = [AGCCloudDBQuery where:[BookInfo class]]; [query equalTo:@YES forField:@"showFlag"]; [self.dbZone subscribeSnapshotWithQuery:query policy:AGCCloudDBQueryPolicyCloud listener:^(AGCCloudDBSnapshot * _Nullable snapshot, NSError * _Nullable error) { if (snapshot != nil) { NSArray *bookList = snapshot.snapshotObjects; if (complete) { complete(bookList, nil); } } else { if (complete) { complete(nil, error); } } }]; }

数据查询和排序

在应用界面中,增加了“查询”按钮和排序功能,通过executeQuery实现异步方式查询数据。
- (void)queryAllBooksWithResults:(void(^)(NSArray * bookList, NSError *error))results { AGCCloudDBQuery *query = [AGCCloudDBQuery where:[BookInfo class]]; [self.dbZone executeQuery:query policy:AGCCloudDBQueryPolicyCloud onCompleted:^(AGCCloudDBSnapshot *_Nullable snapshot, NSError *_Nullable error) { if (error) { if (results) { results(nil, error); } } else { NSArray *bookList = snapshot.snapshotObjects; if (results) { results(bookList, nil); } } }]; }

通过查询与limit方法组合,实现限制查询数据显示条数的功能;与orderByAsc方法或者orderByDesc方法组合来实现数据的排序功能。
- (void)fuzzyQueryAGCDataWithBookInfo:(nonnull BMQueryBookDataModel *)bookInfo results:(void(^)(NSArray * bookList, NSError *error))results { AGCCloudDBQuery *query = [AGCCloudDBQuery where:[BookInfo class]]; //contains [query contains:bookInfo.bookName forField:@"bookName"]; //greaterThanOrEqualTo [query greaterThanOrEqualTo:bookInfo.minBookPrice forField:@"price"]; //lessThanOrEqualTo [query lessThanOrEqualTo:bookInfo.maxBookPrice forField:@"price"]; //limit [query limit:(int)bookInfo.count]; //orderByAsc [query orderByAsc:@"bookName"]; [self.dbZone executeQuery:query policy:AGCCloudDBQueryPolicyCloud onCompleted:^(AGCCloudDBSnapshot *_Nullable snapshot, NSError *_Nullable error) { if (error) { if (results) { results(nil, error); } } else { NSArray *bookList = snapshot.snapshotObjects; if (results) { results(bookList, nil); } } }]; }


应用编译运行 【AppGallery|使用Cloud DB构建APP 快速入门 - iOS篇】到此,您已经了解了示例应用的开发流程。您可以编译并在iPhone手机或模拟器上运行示例应用。如需体验示例应用,您可以在A手机或A模拟器上打开应用,并新增数据;然后您可以在B手机或B模拟器上打开应用,查看在A手机或A模拟器上写入的数据。

    推荐阅读