KiiObject の作成

ここでは、KiiObject を新規に作成する方法を説明します。KiiObject の内部に格納する JSON ドキュメントを設定する方法は、キーと値のペアの設定 を参照してください。

KiiObject の作成

KiiObject の作成を行うには、保存先 Bucket の createObject() メソッドを呼び出してクライアント側で KiiObject を作成した後、save(_:) メソッドを呼び出します。作成された KiiObject の ID は、Kii Cloud によって自動的に割り当てられます。

Swift:

  • let bucket = KiiUser.currentUser()!.bucketWithName("MyBucket")
    
    // Create a KiiObject in the application-scope bucket.
    let object = bucket.createObject()
    
    // Set key-value pairs.
    object.setObject(NSNumber(value: 987 as Int32), forKey: "score")
    object.setObject("easy", forKey: "mode")
    object.setObject(NSNumber(value: false as Bool), forKey: "premiumUser")
    
    do{
      // Save the KiiObject.
      try object.saveSynchronous()
    } catch let error as NSError {
      // Handle the error.
      return
    }
  • let bucket = KiiUser.currentUser()!.bucketWithName("MyBucket")
    
    // Create a KiiObject in the application-scope bucket.
    let object = bucket.createObject()
    
    // Set key-value pairs.
    object.setObject(NSNumber(value: 987 as Int32), forKey: "score")
    object.setObject("easy", forKey: "mode")
    object.setObject(NSNumber(value: false as Bool), forKey: "premiumUser")
    
    // Save the KiiObject.
    object.save { (object : KiiObject?, error : Error?) -> Void in
      if (error != nil) {
        // Handle the error.
        return
      }
    }

Objective-C:

  • KiiBucket *bucket = [[KiiUser currentUser] bucketWithName:@"MyBucket"];
    NSError *error = nil;
    
    // Create a KiiObject.
    KiiObject *object = [bucket createObject];
    
    // Set key-value pairs.
    [object setObject:[NSNumber numberWithInt:987]
               forKey:@"score"];
    [object setObject:@"easy"
               forKey:@"mode"];
    [object setObject:[NSNumber numberWithBool:NO]
               forKey:@"premiumUser"];
    
    // Save the KiiObject.
    [object saveSynchronous:&error];
    if (error != nil) {
      // Handle the error.
      return;
    }
  • KiiBucket *bucket = [[KiiUser currentUser] bucketWithName:@"MyBucket"];
    
    // Create a KiiObject.
    KiiObject *object = [bucket createObject];
    
    // Set key-value pairs.
    [object setObject:[NSNumber numberWithInt:987]
               forKey:@"score"];
    [object setObject:@"easy"
               forKey:@"mode"];
    [object setObject:[NSNumber numberWithBool:NO]
               forKey:@"premiumUser"];
    
    // Save the KiiObject.
    [object saveWithBlock:^(KiiObject *object, NSError *error) {
      if (error != nil) {
        // Handle the error.
        return;
      }
    }];

save(_:) メソッドを呼ぶのを忘れないでください。save(_:) メソッドを実行するまで、KiiObject にセットしたキーと値のペアは Kii Cloud に反映されません。

このコードを実行すると、Kii Cloud の指定された Bucket(この例ではユーザースコープの MyBucket)に KiiObject が作成されます。

ここでは、save(_:) メソッドの実行前に、setObject(_:forKey:) メソッドで 3 つのフィールドに値を格納しています。値の格納方法は、キーと値のペアの設定 を参照してください。

ID を指定して KiiObject を作成

作成された KiiObject には自動的に ID が付与されますが、明示的に ID を指定して KiiObject を作成することもできます。

以下に、先ほどと同じ KiiObject を ID を指定して作成する例を挙げます。

Swift:

  • let objectID = "score_userX"
    let bucket = KiiUser.currentUser()!.bucketWithName("MyBucket")
    
    // Create a KiiObject with the specific ID.
    let object = bucket.createObject(withID: objectID)
    
    // Set key-value pairs.
    object.setObject(NSNumber(value: 987 as Int32), forKey: "score")
    object.setObject("easy", forKey: "mode")
    object.setObject(NSNumber(value: false as Bool), forKey: "premiumUser")
    
    do{
      // Save the KiiObject.
      try object.saveAllFieldsSynchronous(true)
    } catch let error as NSError {
      // Handle the error.
      return
    }
  • let objectID = "score_userX"
    let bucket = KiiUser.currentUser()!.bucketWithName("MyBucket")
    
    // Create a KiiObject with the specific ID.
    let object = bucket.createObject(withID: objectID)
    
    // Set key-value pairs.
    object.setObject(NSNumber(value: 987 as Int32), forKey: "score")
    object.setObject("easy", forKey: "mode")
    object.setObject(NSNumber(value: false as Bool), forKey: "premiumUser")
    
    // Save the KiiObject.
    object.saveAllFields(true, with: { (object : KiiObject?, error : Error?) -> Void in
      if (error != nil) {
        // Handle the error.
        return
      }
    })

Objective-C:

  • NSError *error = nil;
    KiiObject *object = nil;
    NSString *objectID = @"score_userX";
    KiiBucket *bucket = [[KiiUser currentUser] bucketWithName:@"MyBucket"];
    
    @try {
      // Create a KiiObject with the specific ID.
      object = [bucket createObjectWithID:objectID];
    }
    @catch (NSException *exp) {
      // The KiiObject ID is invalid.
    }
    
    // Set key-value pairs.
    [object setObject:[NSNumber numberWithInt:987]
               forKey:@"score"];
    [object setObject:@"easy"
               forKey:@"mode"];
    [object setObject:[NSNumber numberWithBool:NO]
               forKey:@"premiumUser"];
    
    // Save the KiiObject.
    [object saveAllFieldsSynchronous:YES withError:&error];
    if (error != nil) {
      // Handle the error.
      return;
    }
  • KiiObject *object = nil;
    NSString *objectID = @"score_userX";
    KiiBucket *bucket = [[KiiUser currentUser] bucketWithName:@"MyBucket"];
    
    @try {
      // Create a KiiObject with the specific ID.
      object = [bucket createObjectWithID:objectID];
    }
    @catch (NSException *exp) {
      // The KiiObject ID is invalid.
    }
    
    // Set key-value pairs.
    [object setObject:[NSNumber numberWithInt:987]
               forKey:@"score"];
    [object setObject:@"easy"
               forKey:@"mode"];
    [object setObject:[NSNumber numberWithBool:NO]
               forKey:@"premiumUser"];
    
    // Save the KiiObject.
    [object saveAllFields:YES withBlock:^(KiiObject *object, NSError *error) {
      if (error != nil) {
        // Handle the error.
        return;
      }
    }];

ID は createObject(WithID:) メソッド実行時に指定します。この際、不正な ID が指定された場合はエラーとなります(使用可能な ID のパターンについては appledoc を参照してください)。

明示的に ID を指定した場合は、saveAllFields(_:with:_:) メソッドを実行することにより Kii Cloud 上に KiiObject が新規作成されます。ID 指定の場合は save(_:) メソッドによる新規作成はできません。

なお、上記の例において "scoreuserX" という ID を持つ KiiObject がサーバーにすでに存在していた場合は、この KiiObject が上書きされます(必要に応じて `saveAllFields(:with:_:)` メソッド実行時に false を指定すると、このような上書きを防ぐことが可能です。詳細については appledoc を参照してください)。

KiiObject アクセスのヒント

  • アプリケーションスコープに書き込めない:

    アプリケーションスコープはすべてのユーザーや、ログイン前の匿名ユーザーの状態でも読み込めますが、書き込むにはユーザーのログインが必要です。もし、アプリでユーザーのログイン操作を省略したい場合は、匿名ユーザーのままアプリケーションスコープの ACL を変更するのではなく、仮ユーザー(Pseudo User)としてログインする設計をおすすめします。詳細は、仮ユーザー(Pseudo User) をご覧ください。

    また、アプリケーションスコープの利用にはセキュリティの考慮も必要です。詳細は、セキュリティ をご覧ください。

  • 書き込んだはずの KiiObject が参照できない:

    Bucket のスコープが意図したとおりかどうか、ご確認ください。

    書き込みと読み込みを異なるスコープで行うと、Bucket 名が同じであっても書き込んだ内容を取得できません。開発者ポータルのデータブラウザを使って読み込んだ場合でも、同様です。

    たとえば、Kii.bucket(withName:"myBucket") でアプリケーションスコープに作成したデータは、Kii.currentUser().bucket(withName:"myBucket") でユーザースコープから読み込もうとしても、結果が得られません。