概述
此示例应用演示了如何快速的使用Cloud DB构建简单的图书管理服务。通过快速入门和示例应用,您将会了解到如下信息:
- 如何使用Cloud DB进行应用开发。
- 应用数据如何写入到Cloud DB。
- 如何实现数据的查询。
- 实时侦听数据的更改。
- 体验端云数据同步等功能。
使用Cloud DB构建应用服务,需要完成以下准备工作:
- 您已经在开发者联盟官网注册帐号并通过实名认证,详细请参见帐号注册认证。
- 您已经在AppGallery Connect控制台上创建项目和应用,详细请参见创建项目。
- 示例应用使用了认证用户的相关权限,需要开通AppGallery Connect认证服务中“匿名帐号”服务,详细请参见认证服务。
- 您已经获取到示例代码,请从示例代码获取。
- 您已在本地安装Xcode。
启用服务 使用Cloud DB服务前,您需要先启用服务。
- 登录AppGallery Connect网站,选择“我的项目”。
- 在项目列表页面中选择项目,单击项目下需要启用云数据库服务的应用。
- 在导航树上选择“构建 > 云数据库”。
- 单击“立即开通”,开通云数据库服务。
文章图片
- (可选)如您还未选择数据处理位置,需要您先设置数据处理位置,具体操作请参见设置数据处理位置。
文章图片
- 服务初始化成功后,即启用云数据库服务成功。
- 登录AppGallery Connect网站,选择“我的项目”。
- 在项目列表页面中选择项目,单击项目下需要创建对象类型的应用。
- 在导航树上选择“构建 > 云数据库”。
- 单击“新增”,进入创建对象类型页面。
文章图片
- 输入对象类型名为“BookInfo”后,单击“下一步”。
- 单击 +新增字段,新增如下字段后,单击“下一步”。
表1 字段定义表 字段名称
类型
主键
非空
加密
默认值
id
Integer
√
√
–
–
bookName
String
–
–
–
–
author
String
–
–
–
–
price
Double
–
–
–
–
publisher
String
–
–
–
–
publishTime
Date
–
–
–
–
shadowFlag
Boolean
–
–
–
true
- 单击 +新增索引 ,设置索引名为“bookName”,索引字段为“bookName”后,单击“下一步”。
- 按照如下要求设置各角色权限后,单击“下一步”。
表2 权限配置表 角色
query
upsert
delete
所有人
√
–
–
认证用户
√
√
√
数据创建者
√
√
√
管理员
√
√
√
- 单击“确定”。 创建完成后返回对象类型列表中,可以查看已创建的对象类型。
- 单击“导出”。
文章图片
- 选择导出文件格式,选择“Objective-C格式”。
- 单击“导出”。 文件将会导出至本地,其内包含该版本中所有的对象类型。导出的Objective-C格式文件在后续步骤用于添加至本地开发环境。
- 登录AppGallery Connect网站,选择“我的项目”。
- 在项目列表页面中选择项目,单击项目下需要创建存储区的应用。
- 在导航树上选择“构建 > 云数据库”。
- 选择“存储区”页签。
- 单击“新增”,进入创建存储区页面。
文章图片
- 输入存储区名称为“CloudDBDemo”。
- 单击“确定”。 创建完成后返回存储区列表中,可以查看已创建的存储区。
- 集成AGC SDK,详细请参见集成AGC SDK。
- 在podfile文件中添加Cloud DB SDK依赖。
pod 'AGConnectDatabase', '~>1.0.4.300'
- 执行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格式文件添加至本地开发环境。
- 初始化Cloud DB,通过AGConnectCloudDB类中的createObjectType方法实现对象类型的定义和创建,详细请参见初始化。
- 通过initEnvironment方法初始化AGConnectCloudDB。
NSError *error = nil; [AGConnectCloudDB initEnvironment:&error];
- 通过shareInstance方法获取AGConnectCloudDB实例,并使用createObjectType方法创建对象类型。
self.agcConnectCloudDB = [AGConnectCloudDB shareInstance]; NSError *createError= nil; [self.agcConnectCloudDB createObjectType:[AGCCloudDBObjectTypeInfoHelper obtainObjectTypeInfo] error:&createError];
- 创建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; }];
- (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模拟器上写入的数据。
推荐阅读
- 工作技巧|ios快捷指令进行钉钉打卡
- 物联网|鸿蒙用户突破3亿,拳打谷歌安卓,脚踢苹果iOS
- ios|哔咔漫画iOS如何下载
- 数据库|Mysql 之索引优化及索引失效
- react|React Native 制作iOS静态库供其他原生项目使用
- MySQL|SQL高级查询
- MySQL|MySQL索引优化及索引失效情况分析
- 图解Redis|Redis 主从复制
- 图解Redis|Redis 是怎么实现 RDB 快照的()