DynamoDb начинается с выпуска Swift 5 - PullRequest
0 голосов
/ 27 мая 2020

Я пытался получить список посещений из Dynamodb, используя параметр begin_with, но просто не могу понять, почему он не может найти результаты при запуске в Xcode / swift 5.

Я могу запустить запрос в узловой рабочей среде и на AWS консоли. У меня такой же код работает для простого запроса.

Функция getUser () работает

   func getUser() {

       // 1) Configure the query
       let queryExpression = AWSDynamoDBQueryExpression()
        queryExpression.keyConditionExpression = "#UserID = :UserID AND #UserDataType = :UserDataType"
       queryExpression.expressionAttributeNames = [
           "#UserID": "UserID",
           "#UserDataType": "UserDataType"
       ]
       queryExpression.expressionAttributeValues = [
           ":UserID" : "1001",
           ":UserDataType" : "User"
       ]
       // 2) Make the query
       let dynamoDbObjectMapper = AWSDynamoDBObjectMapper.default()
       dynamoDbObjectMapper.query(HiViz.self, expression: queryExpression) { (output: AWSDynamoDBPaginatedOutput?, error: Error?) in
           if error != nil {
               print("The request failed. Error: \(String(describing: error))")
           }
           if output != nil {
               for books in output!.items {
                   let booksItem = books as? HiViz
                print("\(booksItem!.Visitorid!)")
               }
           }
       }
    }

queryHiVizTable содержит begin_with, и я не вижу, как решить проблему отсутствия результатов.

   func queryHiVizTable() {

       // 1) Configure the query
       let queryExpression = AWSDynamoDBQueryExpression()
queryExpression.keyConditionExpression = "#UserID = :UserID AND begins_with(#UserDataType, :UserDataType)"

        queryExpression.expressionAttributeNames = [
           "#UserID": "UserID",
           "#UserDataType": "UserDataType"
       ]

       queryExpression.expressionAttributeValues = [
           ":UserID" : "1001",
           ":UserDataType" : "V)"
       ]

       // 2) Make the query
       let dynamoDbObjectMapper = AWSDynamoDBObjectMapper.default()
       dynamoDbObjectMapper.query(HiViz.self, expression: queryExpression) { (output: AWSDynamoDBPaginatedOutput?, error: Error?) in
        print(queryExpression)
        if error != nil {
               print("The request failed. Error: \(String(describing: error))")
           }
           if output != nil {
                for books in output!.items {
                                 let booksItem = books as? HiViz
                    print("\(booksItem!.Visitorid!)")
               }
           }
       }
    }

Новичок в aws, так что цените помощь.

Спасибо

Дэйв

1 Ответ

0 голосов
/ 27 мая 2020

(FYI Swift 5 Xcode 11.5)

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

в приведенном ниже коде у меня была опечатка с a) в userdatatype, которая нарушала begin_with. это должно было быть только V, а не v)

queryExpression.expressionAttributeValues = [
           ":UserID" : "1001",
           ":UserDataType" : "V)"
       ]

данные для 1001 затем вернулись с другой ошибкой

неопознанный селектор отправлен в экземпляр

это произошло из-за данные в БД для одной строки: json.

, когда я тестировал с другим идентификатором пользователя, он работает, как ожидалось.

Если вы используете мой рабочий код ниже в качестве примера, пока следуя руководству на AWS в ссылке, вы должны заставить работать begin_with.

https://docs.aws.amazon.com/aws-mobile/latest/developerguide/how-to-nosql-integrate-an-existing-table.html

 func queryHiVizTable() {

           // 1) Configure the query
           let queryExpression = AWSDynamoDBQueryExpression()
    queryExpression.keyConditionExpression = "#UserID = :UserID AND begins_with(#UserDataType, :UserDataType)"
            queryExpression.expressionAttributeNames = [
               "#UserID": "UserID",
               "#UserDataType": "UserDataType"
           ]
           queryExpression.expressionAttributeValues = [
               ":UserID" : "1001",
               ":UserDataType" : "V"
           ]
           // 2) Make the query
           let dynamoDbObjectMapper = AWSDynamoDBObjectMapper.default()
           dynamoDbObjectMapper.query(HiViz.self, expression: queryExpression) { (output: AWSDynamoDBPaginatedOutput?, error: Error?) in
            print(queryExpression)
            if error != nil {
                   print("The request failed. Error: \(String(describing: error))")
               }
               if output != nil {
                    for books in output!.items {
                                     let booksItem = books as? HiViz
                        print("---utututut---\(booksItem!.VisitorID!)")
                   }
               }
           }
        }
...