Google Fusion Tables 是一种强大的互联网商店大融合和数据访问与可视化的各种方式的结合。虽然仍然被标记为 '实验性',但在 Fusion Tables API v2.0 的成熟度方面已经达到,并为开发者提供了丰富其应用跨多种开发平台的清洁和简单的方法。
在使用 Fusion Tables 时可能会遇到的潜在障碍之一是缺少官方的、专门的 Objective-C API。
Obj-C-FusionTables 是将 Fusion Tables 集成到 iOS 应用中的一种简单且易于使用的解决方案,它是完全基于 Google gtm-oauth2 和 gtm-http-fetcher 库构建的。
Source/FusionTablesAPI
和 Source/GoogeService
文件夹中的所有文件添加到项目目标中。为了与 Fusion Tables 和其他 Google 服务通信,你需要一个 OAuth 2.0 客户端 ID,当请求 OAuth 2.0 访问令牌时,应用程序将使用此 ID。
你项目的 OAuth 2.0 客户端 ID 可以在详细说明中设置,如 Google 开发者控制台 中所述。这里。
在你的项目的 Google API 部分,启用以下 API
现在回到你的 Xcode 项目,在适当的位置(例如,在 App 的 Delegate application:didFinishLaunchingWithOptions:
方法中)插入以下代码行
[[GoogleAuthorizationController sharedInstance] registerClientID:<YOUR-OAUTH2-CLIENT_ID>]
示例项目是一个通用的 iOS8 应用,它可以在 iPhone 和 iPad 模拟器上运行。其主要目的是展示 Obj-C-FusionTables
的典型用法,例如列出表、创建表、设置地图样式、添加信息窗口模板、执行 SQL 查询、插入和删除行、分享你的融合表格等。
如果您在Google账户中已有Fusion Tables,它们将在示例应用中显示。为了确保您数据的安全性,只有从示例应用内部创建的表格可以修改。
在示例项目的目录下,运行
$ pod install
要运行示例项目,您需要按照设置您的Google项目的上述说明,并在App的Delegate中的application:didFinishLaunchingWithOptions:
方法中填写您自己的Google API密钥。
FTTable
类是Fusion Table资源的Objective-C表示,拥有诸如list....
、insert....
、update....
、delete....
等相应的方法。FTTemplate
和FTStyle
类表示的模板和样式。FTSQLQuery
类表示Fusion Table SQL查询资源,具有相应的select...
、insert...
、update...
、delete...
等方法。FTSQLQueryBuilder
帮助构建各种SQL查询的SQL语句。GoogleAuthorizationController
类便捷地包装了Google认证库,提供了简单的登录/注销和认证通用请求到Google服务的简单方法。GoogleServicesHelper
提供对相关Google服务的轻量级易用访问,例如网址缩短器或Google Drive ACL。虽然像Google APIs Client这样的库已经覆盖了这些内容的更深度,但它们也会需要非平凡的安装,并引入另一套API。FTTable *ftTable = [[FTTable alloc] init];
ftTable.ftTableDelegate = self;
[ftTable listFusionTablesWithCompletionHandler:^(NSData *data, NSError *error) {
if (error) {
NSString *errorStr = [SimpleGoogleServiceHelpers remoteErrorDataString:error];
NSLog(@"Error Listing Fusion Tables: %@", errorStr);
} else {
NSDictionary *ftItems = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions error:nil];
NSArray *ftTableObjects = [NSMutableArray arrayWithArray:ftItems[@"items"]];
for (NSDictionary *ftTable in ftTableObjects) {
NSLog(@"Table Name: %@", ftTable[@"name"]);
NSLog(@"Table ID: %@", ftTable[@"tableId"]);
}
}
}];
FTTable *ftTable = [[FTTable alloc] init];
ftTable.ftTableDelegate = self;
[ftTable insertFusionTableWithCompletionHandler:^(NSData *data, NSError *error) {
if (error) {
NSString *errorStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"Error Inserting Fusion Table: %@", errorStr);
} else {
NSDictionary *contentDict = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions error:nil];
NSLog(@"Inserted a new Fusion Table: %@", contentDict);
}
}];
FTTable *ftTable = [[FTTable alloc] init];
ftTable.ftTableDelegate = self;
[ftTable deleteFusionTableWithCompletionHandler:^(NSData *data, NSError *error) {
[[SimpleGoogleServiceHelpers sharedInstance] decrementNetworkActivityIndicator];
if (error) {
NSString *errorStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"Error Deleting Fusion Table: %@", errorStr);
}
}];
类似的编码模式适用于Fusion Tables模板和样式。
FTSQLQuery *ftSQLQuery = [[FTSQLQuery alloc] init];
ftSQLQuery.ftSQLQueryDelegate = self;
[ftSQLQuery sqlInsertWithCompletionHandler:^(NSData *data, NSError *error) {
if (error) {
NSString *errorStr = [GoogleServicesHelper remoteErrorDataString:error];
NSLog (@"Error Inserting Fusion Table Style: %@", errorStr);
} else {
NSDictionary *responceDict = [NSJSONSerialization
JSONObjectWithData:data options:kNilOptions error:nil];
NSArray *rows = responceDict[@"rows"];
if (rows) {
NSLog(@"Inserted %d %@", [rows count], ([rows count] == 1) ? @"row" : @"rows");
NSLog(@"%@", rows);
NSUInteger lastInsertedRowID = [(NSString *)((NSArray *)[rows lastObject])[0] intValue];
} else {
NSLog (@"Error processing Insert Rows response");
}
}
}];
FTSQLQuery *ftSQLQuery = [[FTSQLQuery alloc] init];
ftSQLQuery.ftSQLQueryDelegate = self;
[ftSQLQuery sqlDeleteWithCompletionHandler:^(NSData *data, NSError *error) {
if (error) {
NSString *errorStr = [GoogleServicesHelper remoteErrorDataString:error];
STFail (@"Error Inserting Fusion Table Style: %@", errorStr);
} else {
NSDictionary *responceDict = [NSJSONSerialization
JSONObjectWithData:data options:kNilOptions error:nil];
NSArray *rows = responceDict[@"rows"];
if (rows) {
NSUInteger numRowsDeleted = [(NSString *)((NSArray *)[rows lastObject])[0] intValue];
NSLog(@"Deleted %d %@", numRowsDeleted, (numRowsDeleted == 1) ? @"row" : @"rows");
} else {
NSLog (@"Error processing Delete Rows response");
}
}
}];
例如,简要看一下上面的“删除表”代码,第一个快速的问题可能是:“那么表ID是从哪里来的?”由于FTTable
类是一个无状态的Web资源表示,一种处理参数化的逻辑方式是通过委托模式。下面的FTTable
委托定义如下
@protocol FTDelegate <NSObject>
@optional
- (NSString *)ftTableID;
- (NSArray *)ftColumns;
- (NSString *)ftTitle;
- (NSString *)ftDescription;
- (BOOL)ftIsExportable;
@end
这样更灵活,允许您在应用程序的适当位置实现委托,而不是进入参数化/子类化FTTable
类。类似的方法也被用于其他Obj-C-FusionTables核心类,如FTStyle
和FTTemplate
。
FTSQLQuery
委托者的设计模式略有不同,但本质上遵循相同的设计模式。
@protocol FTSQLQueryDelegate <NSObject>
@optional
- (NSString *)ftSQLSelectStatement;
- (NSString *)ftSQLInsertStatement;
- (NSString *)ftSQLUpdateStatement;
- (NSString *)ftSQLDeleteStatement;
@end
学习特定委托实现的简单方法之一是查看示例项目。显然,这需要一定水平的Fusion Tables API知识,但其Objective-C部分相当简单。以下是一个快速代码示例。
// Sample Fusion Table Title
- (NSString *)ftTitle {
return @"My new cool table";
}
// Sample Fusion Table Columns Definition
- (NSArray *)ftColumns {
return @[
@{@"name": @"entryDate",
@"type": @"STRING"
},
@{@"name": @"entryName",
@"type": @"STRING"
},
@{@"name": @"geometry",
@"type": @"LOCATION"
}];
}
当然,了解API的另一种方法是查看Obj-C-FusionTablesTests
(见下文)。
这些测试旨在涵盖所有核心的Obj-C-FusionTables API操作。测试案例从创建表、样式、模板、插入示例行开始,到清理所有内容并恢复测试的Google账户到初始状态。
Obj-C-FusionTables需要ARC,并针对iOS8及以上版本进行了优化。