キーと値のペアの取得

KiiObject からキーと値のペアを取得するには、KiiObject クラスの getForKey(_:) メソッドを呼び出します。getForKey(_:) メソッドは、値を id 型のオブジェクトとして返します。Swift では想定しているデータ型に応じてダウンキャストすることで値を取得します。

getForKey(_:) メソッドの引数には、取得するキー名を指定します。JSON ドキュメントから、指定した第 1 階層のキーの値が読み込まれます。

以下に JSON ドキュメントのサンプルと、その JSON ドキュメントから値を取得するためのサンプルコードを示します。サンプルコードのコメントは、取得できた値を表します。KiiObject の取得処理まで含む完全なコードは、下記の 基本データ型の取得 を参照してください。

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

Swift 3:

let score = (object.getForKey("score") as! NSNumber).intValue // score=987
let mode = object.getForKey("mode") as! String // mode="easy"
let premiumUser = (object.getForKey("premiumUser") as! NSNumber).boolValue // premiumUser=false

Objective-C:

long score = [[object getObjectForKey:@"score"] integerValue]; // score=987
NSString *mode = [object getObjectForKey:@"mode"]; // mode=@"easy"
BOOL premiumUser = [[object getObjectForKey:@"premiumUser"] boolValue]; // premiumUser=NO

第 2 階層より深い位置の値を読み込みたい場合は、第 1 階層を JSON オブジェクトとして取得してください。

サポートするデータ型

getForKey(_:) メソッドを実行した結果のバリエーションを、以下の表に示します。「読み込み元 JSON の例」に示す JSON ドキュメントを「呼び出し例」で取得すると、「取得結果」の値を取得できます。

なお、Swift の例では、各キーが必ず目的の型で存在することを前提として、as! によって強制的にダウンキャストしています。KiiObject に格納されている型が期待している型と一致しない場合はモバイルアプリがクラッシュするため、必要に応じて as? の利用も検討してください。

Swift 3:

値の型 読み込み元 JSON の例 呼び出し例 取得結果
NSString "data":"123" object.getForKey("data") as! String "123"
NSNumber(Int) "data":123 (object.getForKey("data") as! NSNumber).intValue 123
NSNumber(Int64) "data":123 (object.getForKey("data") as! NSNumber).int64Value 123
NSNumber(Double) "data":123.456 (object.getForKey("data") as! NSNumber).doubleValue 123.456
NSNumber(Bool) "data":true (object.getForKey("data") as! NSNumber).boolValue true
KiiGeoPoint "data":{
"_type": "point",
"lat": 35.658603,
"lon": 139.745433
}
object.getGeoPoint(forKey: "data") 位置情報 (35.658603, 139.745433)
NSArray "data":[1,2,3] object.getForKey("data") as! NSArray [1,2,3]
NSDictionary "data":{"a":"b"} object.getForKey("data") as! NSDictionary {"a":"b"}

Objective-C:

値の型 読み込み元 JSON の例 呼び出し例 取得結果
NSString "data":"123" [object getObjectForKey:@"data"]; "123"
NSNumber(int) "data":123 [[object getObjectForKey:@"data"] integerValue]; 123
NSNumber(long long) "data":123 [[object getObjectForKey:@"data"] longLongValue]; 123
NSNumber(double) "data":123.456 [[object getObjectForKey:@"data"] doubleValue]; 123.456
NSNumber(BOOL) "data":true [[object getObjectForKey:@"data"] boolValue]; true
KiiGeoPoint "data":{
"_type": "point",
"lat": 35.658603,
"lon": 139.745433
}
[object getGeoPointForKey:@"data"]; 位置情報 (35.658603, 139.745433)
NSArray "data":[1,2,3] [object getObjectForKey:@"data"] [1,2,3]
NSDictionary "data":{"a":"b"} [object getObjectForKey:@"data"] {"a":"b"}

iOS では Android にある、バイト配列を BASE64 にして取得する機能はサポートしていません。必要な場合は文字列で取得後に、アプリ側で BASE64 デコードを行います。

基本データ型の取得

Object にセットされたキーと値のペアを取得するには getForKey(_:) メソッドを実行します。詳細については appledoc を参照してください。

以下に、KiiObject よりキーと値のペアを取得するサンプルを挙げます。

Swift 3:

  • // Instantiate a KiiObject.
    let object = KiiObject(uri: uri)!
    
    do {
      // Refresh the KiiObject to retrieve the latest data from Kii Cloud.
      try object.refreshSynchronous()
    
      // Get key-value pairs.
      let stringData = object!.getForKey("stringValue") as! String
      let intData = (object!.getForKey("intValue") as! NSNumber).intValue
      let longData = (object!.getForKey("longValue") as! NSNumber).int64Value
      let doubleData = (object!.getForKey("doubleValue") as! NSNumber).doubleValue
      let booleanData = (object!.getForKey("booleanValue") as! NSNumber).boolValue
    } catch let error as NSError {
      // Handle the error.
      return
    }
  • // Instantiate a KiiObject.
    let object = KiiObject(uri: uri)!
    
    // Refresh the KiiObject to retrieve the latest data from Kii Cloud.
    object.refresh { (object : KiiObject?, error : Error?) -> Void in
      if error != nil {
        // Handle the error.
        return
      }
      // Get key-value pairs.
      let stringData = object!.getForKey("stringValue") as! String
      let intData = (object!.getForKey("intValue") as! NSNumber).intValue
      let longData = (object!.getForKey("longValue") as! NSNumber).int64Value
      let doubleData = (object!.getForKey("doubleValue") as! NSNumber).doubleValue
      let booleanData = (object!.getForKey("booleanValue") as! NSNumber).boolValue
    }

Objective-C:

  • NSError *error = nil;
    
    // Instantiate a KiiObject.
    KiiObject *object = [KiiObject objectWithURI:uri];
    
    // Refresh the KiiObject to retrieve the latest data from Kii Cloud.
    [object refreshSynchronous:&error];
    if (error != nil) {
      // Handle the error.
      return;
    }
    
    // Get key-value pairs.
    NSString *stringData = [object getObjectForKey:@"stringValue"];
    long intData = [[object getObjectForKey:@"intValue"] integerValue];
    long long longData = [[object getObjectForKey:@"longValue"] longLongValue];
    double doubleData = [[object getObjectForKey:@"doubleValue"] doubleValue];
    BOOL booleanData = [[object getObjectForKey:@"booleanValue"] boolValue];
  • NSError *error = nil;
    
    // Instantiate a KiiObject.
    KiiObject *object = [KiiObject objectWithURI:uri];
    
    // Refresh the KiiObject to retrieve the latest data from Kii Cloud.
    [object refreshWithBlock:^(KiiObject *object, NSError *error) {
      if (error != nil) {
        // Handle the error.
        return;
      }
    
      // Get key-value pairs.
      NSString *stringData = [object getObjectForKey:@"stringValue"];
      long intData = [[object getObjectForKey:@"intValue"] integerValue];
      long long longData = [[object getObjectForKey:@"longValue"] longLongValue];
      double doubleData = [[object getObjectForKey:@"doubleValue"] doubleValue];
      BOOL booleanData = [[object getObjectForKey:@"booleanValue"] boolValue];
    }];

インスタンス作成後、refresh(_:) メソッドを呼ぶのを忘れないようにしてください。KiiObject のインスタンスを生成しただけでは、KiiObject の中身は最新のものになりません。

キー一覧の取得

Object にセットされているキーと値のペアの一覧は、次の例のように dictionaryValue() メソッドを使って NSDictionary に変換することで確認できます。

Swift 3:

  • // Instantiate a KiiObject.
    let object = bucket.createObject(withID: "_ID_OF_THE_OBJECT_")
    
    do{
      // Refresh the KiiObject to retrieve the latest data from Kii Cloud.
      try object.refreshSynchronous()
    } catch let error as NSError {
      // Handle the error.
      return
    }
    
    // Convert key-value pairs to Dictionary.
    let dictionary = object.dictionaryValue()
    for (key,value) in dictionary {
      // Do something with each key.
    }
  • // Instantiate a KiiObject.
    let object = bucket.createObject(withID: "_ID_OF_THE_OBJECT_")
    
    // Refresh the KiiObject to retrieve the latest data from Kii Cloud.
    object.refresh { (object : KiiObject?, error : Error?) -> Void in
      if error != nil {
        // Handle the error.
        return
      }
    
      // Convert key-value pairs to Dictionary.
      let dictionary = object!.dictionaryValue()
      for (key,value) in dictionary {
        // Do something with each key.
      }
    }

Objective-C:

  • NSError *error = nil;
    KiiObject *object = nil;
    
    @try {
      // Instantiate a KiiObject.
      object = [bucket createObjectWithID:@"_ID_OF_THE_OBJECT_"];
    }
    @catch (NSException *exp) {
      // The KiiObject ID is invalid.
      return;
    }
    
    // Refresh the KiiObject to retrieve the latest data from Kii Cloud.
    [object refreshSynchronous:&error];
    if (error != nil) {
      // Handle the error.
      return;
    }
    
    // Convert key-value pairs to NSDictionary.
    NSDictionary* dictionary = [object dictionaryValue];
    for (NSString* key in [dictionary keyEnumerator]) {
      // Do something with each key.
    }
  • KiiObject *object = nil;
    
    @try {
      // Instantiate a KiiObject.
      object = [bucket createObjectWithID:@"_ID_OF_THE_OBJECT_"];
    }
    @catch (NSException *exp) {
      // The KiiObject ID is invalid.
      return;
    }
    
    // Refresh the KiiObject to retrieve the latest data from Kii Cloud.
    [object refreshWithBlock:^(KiiObject *object, NSError *error) {
      if (error != nil) {
        // Handle the error.
        return;
      }
    
      // Convert key-value pairs to NSDictionary.
      NSDictionary* dictionary = [object dictionaryValue];
      for (NSString* key in [dictionary keyEnumerator]) {
        // Do something with each key.
      }
    }];

dictionaryValue() メソッドでは、プログラムから設定したキーおよび所定キーの両方について、キーと値のペアの一覧を NSDictionary に変換できます。所定キーについて詳しくは、所定キー をご覧ください。

空の値の読み込み

キーと値のペアの取得の際は、存在しないキーの値を読み込んだときと JSON の null を読み込んだときで挙動が違います。

たとえば、以下のような JSON が書き込まれているオブジェクトから値を読み込むものとします。

{
  "key1": null,
  "key2": ""
}

各メソッドでの取得結果は以下のとおりです。

  • [json getObjectForKey:@"key1"] は NSNull を返します。
  • [json getObjectForKey:@"key2"] は空文字列を表す NSString を返します。
  • [json getObjectForKey:@"key3"] は nil を返します。

JSON とデータ型との対応の詳細は、取得時のデータ変換 をご覧ください。

作成/更新時間の取得

Kii Cloud は、Object の作成時間と最終更新時間を自動的にセットします(いずれも UNIX 時間、ミリ秒)。これらの情報は、それぞれ KiiObject オブジェクトの created プロパティと modified プロパティによって取得可能です。

なお、時間は UTC(協定世界時)で保存されているため、必要に応じて変換を行ってください。

位置情報(GeoPoint)の取得

Object にセットした位置情報を抽出するには、まず Object のキーを指定して getGeoPoint(forKey:) メソッドを実行し、KiiGeoPoint オブジェクトを取得します。この後、latitude プロパティおよび longitude プロパティから、それぞれ緯度、経度の取得を行います。

Swift 3:

// Get GeoPoints from the "location1" and "location2" keys.
let gp1 = object!.getGeoPoint(forKey: "location1")!
let gp2 = object!.getGeoPoint(forKey: "location2")!

// Get the latitude and longitude data.
let latitude1 = gp1.latitude
let longitude1 = gp1.longitude
let latitude2 = gp2.latitude
let longitude2 = gp2.longitude

Objective-C:

// Get GeoPoints from the "location1" and "location2" keys.
KiiGeoPoint *gp1 = [object getGeoPointForKey:@"location1"];
KiiGeoPoint *gp2 = [object getGeoPointForKey:@"location2"];

// Get the latitude and longitude data.
double latitude1 = [gp1 latitude];
double longitude1 = [gp1 longitude];
double latitude2 = [gp2 latitude];
double longitude2 = [gp2 longitude];

複雑なデータ型の取得

Object にセットした、JSON オブジェクトや JSON オブジェクトの配列などのデータ型は、それぞれに対応するデータ型として取得できます。

複雑なデータ型の設定 のサンプルコードでセットした値を取得する例を以下に挙げます。

Swift 3:

// Get a value of a JSON object.
let jsonObject = object!.getForKey("myJsonObject") as! NSDictionary

// Get a value of a JSON array.
let jsonArray = object!.getForKey("myJsonArray") as! NSArray
let jsonObject1 = jsonArray.object(at: 0)
let jsonObject2 = jsonArray.object(at: 1)

Objective-C:

// Get a value of a JSON object.
NSDictionary* jsonObject = [object getObjectForKey:@"myJsonObject"];

// Get a value of a JSON array.
NSArray* jsonArray = [object getObjectForKey:@"myJsonArray"];
NSDictionary* jsonObject1 = [jsonArray objectAtIndex:0];
NSDictionary* jsonObject2 = [jsonArray objectAtIndex:1];