Parse.com をちょっと使ってみました。ちょっとしたデータのやりとりをする環境として使うのは、なかなかいいんじゃないかと思います。

あるアプリのアイデアを思いついて、これは作るしかない!と意気込んで Parse のアカウントを取ったのですが、すでに類似のアプリがあって頓挫しました…。

残念ながら、すぐに Parse でなにかすることはなくなったのですが、データベースを少し触って外部結合した結果だけまとめたいと思います。また何か思いつくかもしれないので…。

2 つのテーブルを外部結合する

店を管理する Shop テーブルと、店のジャンルを管理する Category テーブルがあり、外部キーで結合する例です。

Shop テーブル

id name category
1 ほげほげコーヒー 10001
2 ふがふがカフェ 10001
3 ぴよぴよラーメン 10002

Category テーブル

id name
10001 カフェ
10002 ラーメン

よくある形ですね。

Category テーブルの name カラムの値が カフェ のものだけを取得したい場合を考えます。 SQLなら、

SELECT * FROM Shop LEFT OUTER JOIN Category ON Shop.category = Category.id WHERE Category.name = "カフェ"

ような感じでしょうか。(間違っていたらすいません)

Parse のデータベースで Shop テーブルの内容を取得する (PFObject を取得する) 場合、以下のようにします。

PFQuery *categoryQuery = [PFQuery queryWithClassName:@"Category"];
[categoryQuery whereKey:@"name" containsString:@"カフェ"];

PFQuery *shopQuery = [[PFQuery queryWithClassName:@"Shop"] orderByAscending:@"name"];
[shopQuery includeKey:@"category"];
[shopQuery whereKey:@"category" matchesQuery:categoryQuery];

// 非同期 で画像を取得
[shopQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (!error) {
        for (PFObject *cafe in objects) {
            NSLog(@"shop = %@", cafe[@"name"]);
            NSLog(@"category = %@", cafe[@"category"]);
            PFObject *category = cafe[@"category"];
            PFFile *iconFile = cafe[@"icon"];
            [iconFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
                if (!error) {
                    UIImage *image = [UIImage imageWithData:data scale:[UIScreen mainScreen].scale];
                    self.iconImage.image = image;
                }
            }];
        }
    }
}];

前提として、Shop テーブルの category は、Category テーブルの idPointer が設定されている必要があります。