Как сохранить словарь (объект карты) в DynamoDB с помощью Swift

Я пытаюсь сохранить словарь в поле таблицы DynamoDB с помощью низкоуровневого API. Я не мог понять, как это сделать с помощью Object Mapper. В документации AWS iOS для этого нет примера, и я безуспешно пытался исследовать и реализовать примеры Java / .NET на ту же тему.

Я хочу обновить только поле словаря в строке с помощью updateExpression.

Я наткнулся на этот вопрос во время поиска ответа, но это не помогло: Как лучше всего выполнять запросы к Amazon AWS DynamoDB с помощью Swift?

Вот функция для обновления таблицы DynamoDB:

func saveMapToDatabase(hashKey:Int, rangeKey:Double, myDict:[Int:Double]){
    let nsDict:NSDictionary = NSDictionary(dictionary: myDict)
    var dictAsAwsValue = AWSDynamoDBAttributeValue();dictAsAwsValue.M = nsDict as [NSObject : AnyObject]

    let updateInput:AWSDynamoDBUpdateItemInput = AWSDynamoDBUpdateItemInput()
    let hashKeyValue:AWSDynamoDBAttributeValue = AWSDynamoDBAttributeValue();hashKeyValue.N = String(hashKey)
    let rangeKeyValue:AWSDynamoDBAttributeValue = AWSDynamoDBAttributeValue(); rangeKeyValue.N = String(stringInterpolationSegment: rangeKey)

    updateInput.tableName = "my_table_name"
    updateInput.key = ["db_hash_key" :hashKeyValue, "db_range_key":rangeKeyValue]

    //How I usually do low-level update:
    //let valueUpdate:AWSDynamoDBAttributeValueUpdate = AWSDynamoDBAttributeValueUpdate()
    //valueUpdate.value = dictAsAwsValue
    //valueUpdate.action = AWSDynamoDBAttributeAction.Put
    //updateInput.attributeUpdates = ["db_dictionary_field":valueUpdate]

    //Using the recommended way: updateExpression
    updateInput.expressionAttributeValues = ["dictionary_value":dictAsAwsValue]
    updateInput.updateExpression = "SET db_dictionary_field = :dictionary_value"

    self.dynamoDB.updateItem(updateInput).continueWithBlock{(task:BFTask!)->AnyObject! in
        //do some debug stuff
        println(updateInput.aws_properties())
        println(task.description)

        return nil
    }
}

person Toni Nurmi    schedule 18.10.2015    source источник
comment
Вы можете ознакомиться с тест сопоставления объектов для примера кода.   -  person Yosuke Matsuda    schedule 20.10.2015


Ответы (1)


Я решил это, проблема заключалась в том, что AWS требует, чтобы ключи словаря всегда были в виде String, любой другой тип не допускается.

Фрагмент рабочего решения:

...
updateInput.tableName = "my_table_name"
updateInput.key = ["db_hash_key" :hashKeyValue, "db_range_key":rangeKeyValue]

let dictionaryInRightFormat:NSDictionary = ["stringKey":dictAsAwsValue]
updateInput.expressionAttributeValues = updateInput.updateExpression = "SET db_dictionary_field = :stringKey"
person Toni Nurmi    schedule 10.12.2015