キーと値のペアの設定

KiiObject にキーと値のペアを設定するには、KiiObject クラスの setObject(forKey:) メソッドを呼び出します。setObject(forKey:) メソッドは格納する型ごとにオーバーロードされたメソッドを用意しています。

setObject(forKey:) メソッドの引数には、キー名と値を設定します。指定したキーと値のペアは JSON ドキュメントの第 1 階層として保存されます。

以下に値を設定するためのサンプルコードを示します。KiiObject の保存処理まで含む完全なコードは、KiiObject の作成、または、下記の 基本データ型の設定 を参照してください。また、KiiObject の更新 でも値の設定を行います。

Swift:

let object = bucket.createObject()
object.setObject(NSNumber(integerLiteral: 987), forKey: "score")
object.setObject("easy", forKey: "mode")
object.setObject(NSNumber(booleanLiteral: false), forKey: "premiumUser")

Objective-C:

KiiObject *object = [bucket createObject];
[object setObject:[NSNumber numberWithInt:987]
           forKey:@"score"];
[object setObject:@"easy"
           forKey:@"mode"];
[object setObject:[NSNumber numberWithBool:NO]
           forKey:@"premiumUser"];

このコードを実行後、KiiObject を保存すると、JSON 形式のデータが作成されます(管理用フィールドは省略しています)。

{
  "score": 987,
  "premiumUser": false,
  "mode": "easy"
}

第 2 階層より深い位置に値を書き込みたい場合は、目的の階層に値をセットした JSONObject を第 1 階層に書き込んでください。

1 つの KiiObject に格納できるデータの最大サイズは、キーと値のペアを JSON 形式で表現した状態で 65534 文字までです(サイズには Kii Cloud が内部で使用するフィールドも含まれます)。

サポートするデータ型

setObject(forKey:) メソッドの値部分は、NSString、NSNumber、NSArray、NSDictionary のいずれかの型を指定できます。

Kii Cloud に格納できる数値の範囲には制限がないため、NSNumber がサポートする様々な型の最大値を格納することができます。以下の表には Int、Bool、Double の例を示していますが、イニシャライザ NSNumber(value:) によって、Int16 や Float などの他の型を扱うこともできます。

表の「JSON での値の格納結果」は、開発者ポータルのデータブラウザーで確認したり、他のプラットフォームで参照したりする際の参考として利用できます。格納と参照を同じ型で行う場合、JSON での格納結果を意識する必要は特にありません。

Swift:

値の型 呼び出し例 JSON での値の格納結果 備考
NSString object.setObject("123", forKey: "data"); "data":"123"
NSNumber(Int) object.setObject(NSNumber(integerLiteral: 123), forKey: "data"); "data":123
NSNumber(Int64) object.setObject(NSNumber(value: 123 as Int64), forKey: "data"); "data":123
NSNumber(Double) object.setObject(NSNumber(floatLiteral: 123.456), forKey: "data"); "data":123.456
NSNumber(Bool) object.setObject(NSNumber(booleanLiteral: true), forKey: "data"); "data":true NSNumber でも Bool を設定済みの場合は true/false を格納
KiiGeoPoint object.setGeoPoint(geoPoint, forKey: "data"); "data":{
"_type": "point",
"lat": 35.658603,
"lon": 139.745433
}
geoPoint が (35.658603, 139.745433) の場合
NSArray object.setObject(array, forKey: "data"); "data":[1,2,3] array が [1,2,3] の場合
NSDictionary object.setObject(json, forKey: "data"); "data":{"a":"b"} json が {"a":"b"} の場合

Objective-C:

値の型 呼び出し例 JSON での値の格納結果 備考
NSString [object setObject:@"123" forKey:@"data"]; "data":"123"
NSNumber(int) [object setObject:[NSNumber numberWithInt:123] forKey:@"data"]; "data":123
NSNumber(long long) [object setObject:[NSNumber numberWithLongLong:123] forKey:@"data"]; "data":123
NSNumber(double) [object setObject:[NSNumber numberWithDouble:123.456] forKey:@"data"]; "data":123.456
NSNumber(BOOL) [object setObject:[NSNumber numberWithBool:YES] forKey:@"data"]; "data":true NSNumber でも BOOL を設定済みの場合は true/false を格納
KiiGeoPoint [object setGeoPoint:geoPoint forKey:@"data"]; "data":{
"_type": "point",
"lat": 35.658603,
"lon": 139.745433
}
geoPoint が (35.658603, 139.745433) の場合
NSArray [object setObject:array forKey:@"data"]; "data":[1,2,3] array が [1,2,3] の場合
NSDictionary [object setObject:json forKey:@"data"]; "data":{"a":"b"} json が {"a":"b"} の場合
  • 値として null を設定する方法はありません。設定すると無視またはエラーとなります。
  • 日付型(NSDate)を設定したい場合、timeIntervalSince1970 プロパティが返した Double 型の値を 1000 倍することにより、1970 年 1 月 1 日 00:00:00 UTC からのミリ秒数として格納すれば扱いが簡単になります。
  • iOS では Android にある、バイト配列を BASE64 にして出力する機能はサポートしていません。

基本データ型の設定

KiiObject の新規作成時に、NSString、Int、Double、Bool の各データ型を格納する例を以下に示します。

なお、以下のサンプルコードは、KiiObject の作成 のサンプルコードより、値の格納部分を変更したものです。

Swift:

  • // Create a KiiObject.
    let bucket = KiiUser.currentUser()!.bucketWithName("MyBucket")
    let object = bucket.createObject()
    
    // Set key-value pairs.
    object.setObject("my value", forKey: "stringValue")
    object.setObject(NSNumber(integerLiteral: 123), forKey: "intValue")
    object.setObject(NSNumber(value: UInt64(Date().timeIntervalSince1970 * 1000)), forKey: "longValue")
    object.setObject(NSNumber(floatLiteral: 987.654), forKey: "doubleValue")
    object.setObject(NSNumber(booleanLiteral: true), forKey: "booleanValue")
    
    do{
      // Save the KiiObject.
      try object.saveSynchronous()
    } catch let error as NSError {
      // Handle the error.
      return
    }
  • // Create a KiiObject.
    let bucket = KiiUser.currentUser()!.bucketWithName("MyBucket")
    let object = bucket.createObject()
    
    // Set key-value pairs.
    object.setObject("my value", forKey: "stringValue")
    object.setObject(NSNumber(integerLiteral: 123), forKey: "intValue")
    object.setObject(NSNumber(value: UInt64(Date().timeIntervalSince1970 * 1000)), forKey: "longValue")
    object.setObject(NSNumber(floatLiteral: 987.654), forKey: "doubleValue")
    object.setObject(NSNumber(booleanLiteral: true), forKey: "booleanValue")
    
    // Save the KiiObject.
    object.save { (object : KiiObject?, error : Error?) -> Void in
      if (error != nil) {
        // Handle the error.
        return
      }
    }

Objective-C:

  • NSError *error = nil;
    
    // Create a KiiObject.
    KiiBucket *bucket = [[KiiUser currentUser] bucketWithName:@"MyBucket"];
    KiiObject *object = [bucket createObject];
    
    // Set key-value pairs.
    [object setObject:@"my value"
               forKey:@"stringValue"];
    [object setObject:[NSNumber numberWithInt:123]
               forKey:@"intValue"];
    [object setObject:[NSNumber numberWithLongLong:(long long)([[NSDate date] timeIntervalSince1970] * 1000)]
               forKey:@"longValue"];
    [object setObject:[NSNumber numberWithDouble:987.654]
               forKey:@"doubleValue"];
    [object setObject:[NSNumber numberWithBool:YES]
               forKey:@"booleanValue"];
    
    // Save the KiiObject.
    [object saveSynchronous:&error];
    if (error != nil) {
      // Handle the error.
      return;
    }
  • // Create a KiiObject.
    KiiBucket *bucket = [[KiiUser currentUser] bucketWithName:@"MyBucket"];
    KiiObject *object = [bucket createObject];
    
    // Set key-value pairs.
    [object setObject:@"my value"
               forKey:@"stringValue"];
    [object setObject:[NSNumber numberWithInt:123]
               forKey:@"intValue"];
    [object setObject:[NSNumber numberWithLongLong:(long long)([[NSDate date] timeIntervalSince1970] * 1000)]
               forKey:@"longValue"];
    [object setObject:[NSNumber numberWithDouble:987.654]
               forKey:@"doubleValue"];
    [object setObject:[NSNumber numberWithBool:YES]
               forKey:@"booleanValue"];
    
    // Save the KiiObject.
    [object saveWithBlock:^(KiiObject *object, NSError *error) {
      if (error != nil) {
        // Handle the error.
        return;
      }
    }];

このコードを実行すると、KiiObject には以下のような JSON 形式のデータが作成されます(管理用フィールドは省略しています)。

{
  "stringValue": "my value",
  "booleanValue": true,
  "longValue": 1495677489018,
  "doubleValue": 987.654,
  "intValue": 123
}

位置情報(GeoPoint)の設定

次に、KiiObject に位置情報(GeoPoint)をセットする方法を説明します。

位置情報を格納するには、まず緯度と経度を指定して KiiGeoPoint オブジェクトを作成します。この後、作成した GeoPoint を値として持つキーと値のペアを setGeoPoint(_:forKey:) メソッドを用いて KiiObject にセットします。

例として、アプリケーションスコープに存在する "MyBucket" という Bucket 内に KiiObject を作成し、これに位置情報を 2 つセットするサンプルコードを以下に挙げます。

Swift:

  • // Create a KiiObject.
    let bucket = KiiUser.currentUser()!.bucketWithName("MyBucket")
    let object = bucket.createObject()
    
    // Create GeoPoint objects.
    let point1 = KiiGeoPoint(latitude: 35.658603, andLongitude: 139.745433)
    let point2 = KiiGeoPoint(latitude: 35.658625, andLongitude: 139.745415)
    
    // Set the GeoPoints to the KiiObject.
    object.setGeoPoint(point1, forKey:"location1")
    object.setGeoPoint(point2, forKey:"location2")
    
    do{
      // Save the KiiObject.
      try object.saveSynchronous()
    } catch let error as NSError {
      // Handle the error.
      return
    }
  • // Create a KiiObject.
    let bucket = KiiUser.currentUser()!.bucketWithName("MyBucket")
    let object = bucket.createObject()
    
    // Create GeoPoint objects.
    let point1 = KiiGeoPoint(latitude: 35.658603, andLongitude: 139.745433)
    let point2 = KiiGeoPoint(latitude: 35.658625, andLongitude: 139.745415)
    
    // Set the GeoPoints to the KiiObject.
    object.setGeoPoint(point1, forKey:"location1")
    object.setGeoPoint(point2, forKey:"location2")
    
    // Save the KiiObject.
    object.save { (object : KiiObject?, error : Error?) -> Void in
      if (error != nil) {
        // Handle the error.
        return
      }
    }

Objective-C:

  • NSError *error = nil;
    
    // Create a KiiObject.
    KiiBucket *bucket = [[KiiUser currentUser] bucketWithName:@"MyBucket"];
    KiiObject *object = [bucket createObject];
    
    // Create GeoPoint objects.
    KiiGeoPoint *point1 = [[KiiGeoPoint alloc] initWithLatitude:35.658603
                                                   andLongitude:139.745433];
    KiiGeoPoint *point2 = [[KiiGeoPoint alloc] initWithLatitude:35.658625
                                                   andLongitude:139.745415];
    
    // Set the GeoPoints to the KiiObject.
    if (point1) {
      [object setGeoPoint:point1
                   forKey:@"location1"];
    }
    if (point2) {
      [object setGeoPoint:point2
                   forKey:@"location2"];
    }
    
    // Save the KiiObject.
    [object saveSynchronous:&error];
    if (error != nil) {
      // Handle the error.
      return;
    }
  • // Create a KiiObject.
    KiiBucket *bucket = [[KiiUser currentUser] bucketWithName:@"MyBucket"];
    KiiObject *object = [bucket createObject];
    
    // Create GeoPoint objects.
    KiiGeoPoint *point1 = [[KiiGeoPoint alloc] initWithLatitude:35.658603
                                                   andLongitude:139.745433];
    KiiGeoPoint *point2 = [[KiiGeoPoint alloc] initWithLatitude:35.658625
                                                   andLongitude:139.745415];
    
    // Set the GeoPoints to the KiiObject.
    if (point1) {
      [object setGeoPoint:point1
                   forKey:@"location1"];
    }
    if (point2) {
      [object setGeoPoint:point2
                   forKey:@"location2"];
    }
    
    // Save the KiiObject.
    [object saveWithBlock:^(KiiObject *object, NSError *error) {
      if (error != nil) {
        // Handle the error.
        return;
      }
    }];

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

複雑なデータ型の設定

単純なデータ型以外にも、JSON オブジェクトや JSON オブジェクトの配列などのデータ型を SDK でサポートしています。それぞれ、NSDictionary や NSArray などのデータ型に対応します。

以下にこれらのデータ型の値を格納する例を挙げます。

Swift:

  • // Create a KiiObject.
    let bucket = KiiUser.currentUser()!.bucketWithName("MyBucket")
    let object = bucket.createObject()
    
    // Set a value of a JSON object.
    let jsonObject: Dictionary = ["score": 987, "mode": "easy"] as [String : Any]
    object.setObject(jsonObject, forKey: "myObject")
    
    // Set a value of a JSON array.
    let arrayElement1: Dictionary = ["Name": "Alice", "age": 30] as [String : Any]
    let arrayElement2: Dictionary = ["Name": "Bob", "age": 28] as [String : Any]
    let jsonArray = [arrayElement1, arrayElement2]
    object.setObject(jsonArray, forKey: "myArray")
    
    do{
      // Save the KiiObject.
      try object.saveSynchronous()
    } catch let error as NSError {
      // Handle the error.
      return
    }
  • // Create a KiiObject.
    let bucket = KiiUser.currentUser()!.bucketWithName("MyBucket")
    let object = bucket.createObject()
    
    // Set a value of a JSON object.
    let jsonObject: Dictionary = ["score": 987, "mode": "easy"] as [String : Any]
    object.setObject(jsonObject, forKey: "myObject")
    
    // Set a value of a JSON array.
    let arrayElement1: Dictionary = ["Name": "Alice", "age": 30] as [String : Any]
    let arrayElement2: Dictionary = ["Name": "Bob", "age": 28] as [String : Any]
    let jsonArray = [arrayElement1, arrayElement2]
    object.setObject(jsonArray, forKey: "myArray")
    
    // Save the KiiObject.
    object.save { (object : KiiObject?, error : Error?) -> Void in
      if (error != nil) {
        // Handle the error.
        return
      }
    }

Objective-C:

  • NSError *error = nil;
    
    // Create a KiiObject.
    KiiBucket *bucket = [[KiiUser currentUser] bucketWithName:@"MyBucket"];
    KiiObject *object = [bucket createObject];
    
    // Set a value of a JSON object.
    NSDictionary* jsonObject = @{@"score":@987, @"mode":@"easy"};
    [object setObject:jsonObject
               forKey:@"myObject"];
    
    // Set a value of a JSON array.
    NSDictionary* arrayElement1 = @{@"Name":@"Alice", @"age":@30};
    NSDictionary* arrayElement2 = @{@"Name":@"Bob", @"age":@28};
    NSArray* jsonArray = @[arrayElement1, arrayElement2];
    [object setObject:jsonArray
               forKey:@"myArray"];
    
    // Save the KiiObject.
    [object saveSynchronous:&error];
    if (error != nil) {
      // Handle the error.
      return;
    }
  • // Create a KiiObject.
    KiiBucket *bucket = [[KiiUser currentUser] bucketWithName:@"MyBucket"];
    KiiObject *object = [bucket createObject];
    
    // Set a value of a JSON object.
    NSDictionary* jsonObject = @{@"score":@987, @"mode":@"easy"};
    [object setObject:jsonObject
               forKey:@"myObject"];
    
    // Set a value of a JSON array.
    NSDictionary* arrayElement1 = @{@"Name":@"Alice", @"age":@30};
    NSDictionary* arrayElement2 = @{@"Name":@"Bob", @"age":@28};
    NSArray* jsonArray = @[arrayElement1, arrayElement2];
    [object setObject:jsonArray
               forKey:@"myArray"];
    
    // Save the KiiObject.
    [object saveWithBlock:^(KiiObject *object, NSError *error) {
      if (error != nil) {
        // Handle the error.
        return;
      }
    }];

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

このコードを実行すると、KiiObject には以下のような JSON 形式のデータが作成されます(管理用フィールドは省略しています)。

{
  "myArray": [
    {
      "Name": "Alice",
      "age": 30
    },
    {
      "Name": "Bob",
      "age": 28
    }
  ],
  "myObject": {
    "score": 987,
    "mode": "easy"
  }
}