サーバー構築不要!スマートフォンアプリ向けの新クラウド

トップ >ドキュメント >SDKガイド(iOS):オブジェクト操作

SDKガイド(iOS)

オブジェクト操作

このドキュメントは更新されていません。
こちらから最新版をご覧ください。

NCMBObjectについて

ニフクラ mobile backendのデータストア機能はNCMBObjectを通じて利用します。
NCMBObjectはスキーマレスなJSON互換のkey-value形式のオブジェクトを扱うことができます。
オブジェクトの保存先はNCMBObjectの初期化時に指定したクラスで識別されます。

オブジェクトをデータストアに保存する

オブジェクトをデータストアに非同期で保存するには、saveInBackgroundWithBlockメソッドが利用できます。
同期で保存する場合には、saveメソッドを使用します。
指定したクラスがデータストアに存在しない場合は、新規にクラスが作成されます。
※ role, file, push, user, installation などは標準クラスとして作成されているので、新規クラス作成時にはクラス名にセットできません。

NCMBObject *post = [NCMBObject objectWithClassName:@"Post"];
[post setObject:@"ncmb" forKey:@"author"];
[post setObject:@"Hello World." forKey:@"contents"];
[post addObject:@"greeting" forKey:@"tags"];
[post addObject:@"info" forKey:@"tags"];
[post setObject:[NSNumber numberWithBool:NO] forKey:@"publication"];
[post saveInBackgroundWithBlock:nil];

基本的なデータ型は以下の通りです。JSONにシリアライズして送信されます。

NSNumber *number = [NSNumber numberWithInt:42];
NSString *string = [NSString stringWithFormat:@"the number is %@", number];
NSArray *array = [NSArray arrayWithObjects:string, number, nil];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:number, @"number",
                            string, @"string",
                            nil];
NSNull *null = [NSNull null];

NCMBObject *bigObject = [NCMBObject objectWithClassName:@"BigObject"];
[bigObject setObject:number     forKey:@"myNumber"];
[bigObject setObject:string     forKey:@"myString"];
[bigObject setObject:array      forKey:@"myArray"];
[bigObject setObject:dictionary forKey:@"myDictionary"];
[bigObject setObject:null       forKey:@"myNull"];
[bigObject saveInBackgroundWithBlock:nil];

NSDateクラスとの相互変換

NSDate型とmobile backendの日付型を相互に変換する事が出来ます。

NSDateを保存する

NCMBObject *obj = [NCMBObject objectWithClassName:className];

[obj setObject:[NSDate date] forKey:@"date"];
[obj save:nil];

NSDateを取得する

NCMBObject *saved = [NCMBObject objectWithClassName:className];
saved.objectId = obj.objectId;
[saved fetch:nil];
NSDate *date = [saved objectForKey:@"date"];
NSLog(@"date:%@", date);

オブジェクトの取得

以下のサンプルはPostクラスを検索するためのクエリを生成後、authorがncmbと一致するオブジェクトを検索しています。

NCMBQuery *query = [NCMBQuery queryWithClassName:@"Post"];
[query whereKey:@"author" equalTo:@"ncmb"];
[query findObjectsInBackgroundWithBlock:^(NSArray *posts, NSError *error) {
    for (NCMBObject *post in posts) {
        NSLog(@"%@", post);

        // objectForKeyアクセス
        NSString *author = [post objectForKey:@"author"];
        BOOL publication = [[post objectForKey:@"publication"] boolValue];

        NSLog(@"author:%@, publication:%@", author, publication ? @"YES" : @"NO");

        // プロパティアクセス
        NSString *objectId = post.objectId;
        NSDate *createDate = post.createDate;
        NSDate *updateDate = post.updateDate;
        NSLog(@"objectId: %@, updatedAt: %@, createdAt: %@", objectId, updateDate, createDate);

        // 再取得
        [post refresh:nil];
    }
}];

オフライン状態でのオブジェクト保存

saveEventuallyメソッドは、通信状況をチェックして保存処理を行うメソッドです。
オンラインの場合はsaveInBackgroundWithBlock:メソッドが実行されますが、
ネットワークがオフラインの時には保存処理は行われず、オンラインになり次第再開されます。
保存完了前にアプリが終了された場合、次回起動時に再処理を行います。

NCMBObject *post = [NCMBObject objectWithClassName:@"Post"];
[post setObject:@"ncmb" forKey:@"author"];
[post setObject:@"Hello World." forKey:@"contents"];
[post saveEventually:^(NSError *error) {
    if (!error){
        //保存処理が成功した場合
    } else {
        //保存処理が失敗した場合
    }
}];

オブジェクトの更新

オブジェクトに新しい値をセットしてsaveInBackgroundWithBlockメソッドを実行することで更新されます。

NCMBObject *post = [NCMBObject objectWithClassName:@"Post"];
[post setObject:@"ncmb" forKey:@"author"];
[post setObject:@"Hello World." forKey:@"contents"];
[post addObject:@"greeting" forKey:@"tags"];
[post addObject:@"info" forKey:@"tags"];
[post setObject:[NSNumber numberWithBool:NO] forKey:@"publication"];
[post saveInBackgroundWithBlock:^(NSError *error) {
    // 次の2行が更新処理
    [post setObject:[NSNumber numberWithBool:NO] forKey:@"publication"];
    [post saveInBackgroundWithBlock:nil];

}];

incrementKeyメソッドを利用すると、値がインクリメントされます。

[post incrementKey:@"count"];
[post saveInBackgroundWithBlock:nil];

配列のオブジェクトも同様にデータストアでの管理が可能です。

[post addUniqueObjectsFromArray:[NSArray arrayWithObjects:@"food", @"fish", nil] forKey:@"tags"];
[post saveInBackgroundWithBlock:nil];

オブジェクトの削除

オブジェクトをデータストアから非同期で削除する場合は、deleteInBackgroundWithBlockメソッドを利用します。

[post deleteInBackgroundWithBlock:nil];

オブジェクトの関連付け

オブジェクトを関連データとして扱うことで、関連している両方のオブジェクトを1度に操作することが可能です。

// postを生成
NCMBObject *post = [NCMBObject objectWithClassName:@"Post"];
[post setObject:@"I'm sleepy" forKey:@"title"];
[post setObject:@"If Where can I sleep?" forKey:@"content"];

// comment作成
NCMBObject *comment = [NCMBObject objectWithClassName:@"Comment"];
[comment setObject:@"Very sleepy" forKey:@"content"];

// commentにpostを設定
[comment setObject:post forKey:@"parent"];

// comment, post両方保存される
[comment save:nil];

関連オブジェクトの取得も可能です。

NCMBObject *post = [comment objectForKey:@"parent"];
[post fetchInBackgroundWithBlock:^(NSError *error) {
    NSString *author = [post objectForKey:@"author"];
}];

リレーションへの操作を行うことでも、オブジェクトを関連付けることが可能です。

// リレーションへの追加
NCMBObject *post = [NCMBObject objectWithClassName:@"Post"];
[post setObject:@"about mobile backend" forKey:@"title"];
[post save:nil];

NCMBObject *comment1 = [NCMBObject objectWithClassName:@"Comment"];
[comment1 setObject:@"good" forKey:@"text"];
[comment1 save:nil];

NCMBObject *comment2 = [NCMBObject objectWithClassName:@"Comment"];
[comment2 setObject:@"bad" forKey:@"text2"];
[comment2 save:nil];

NCMBRelation *relation = [post relationforKey:@"comments"];
[relation addObject:comment1];
[relation addObject:comment2];
[post save:nil];


// リレーションから削除
[relation removeObject:comment1];
[post save:nil];

リレーションを利用したクエリ検索も可能です。

// リレーションクエリの生成
NCMBQuery *query = [relation query];

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (error) {
        // There was an error
        NSLog(@"[Error] %@", error);
    } else {
        for (NCMBObject *obj in objects) {
            NSLog(@"[Success] %@", obj);
        }
    }
}];

お探しの内容が見つからなかった場合はユーザーコミュニティ もご活用ください。(回答保証はいたしかねます)
なお、 Expertプラン以上のお客様はテクニカルサポートにてご質問を承らせて頂きます。

推奨画面サイズ1024×768px以上

ページの先頭へ