Проверьте, было ли принято письменное разрешение или отклонено - PullRequest
1 голос
/ 07 октября 2019

В настоящее время я пытаюсь реализовать торговую систему для моего приложения для Android с использованием firebase. Для этого я должен проверить, нажал ли игрок кнопку покупки для одной сделки, а выбранная сделка все еще доступна в базе данных Firebase.

Способ, которым предполагается работать, заключается в том, что игрок, который хочет купить что-то, проверяет в соответствующей сделке, если идентификатор покупателя все еще пуст, и если это так, помещает туда свой собственный идентификатор. Я установил правила для firebase, так что customerId и purchaseName могут быть установлены только один раз.

Итак, вот код, который я пытался использовать:

if (!reference.Child("trading").Child("trade|" + currentTrade.date).Child("buyerId").SetValueAsync(userId).IsCanceled)
{
    Debug.Log("trade should be successfull");
}
else
{
    Debug.Log("trade should have failed");
}

Ну, проблемаТеперь, когда не имеет значения, является ли идентификатор покупателя пустым или нет, консоль единства всегда печатает, что сделка прошла успешно. Но я действительно получаю предупреждение в консоли, что в разрешении отказано. Мой вопрос сейчас, как мне правильно его определить, если IP-адрес customerId уже установлен?

Структура моей базы данных:

{
  "currentVersion" : {
    "FileSize" : 58010,
    "ReleaseDate" : "01.08.19",
    "Version" : "1.10.7.9"
  },
  "trading" : {
    "trade|1570361586" : {
      "amount" : 5,
      "buyerId" : "",
      "buyerName" : "",
      "date" : 1570361586,
      "item" : 7,
      "price" : 6,
      "sellerId" : "1234",
      "sellerName" : "testA"
    },
    "trade|1570363226" : {
      "amount" : 1,
      "buyerId" : "9876",
      "buyerName" : "testB",
      "date" : 1570363226,
      "item" : 7,
      "price" : 1,
      "sellerId" : "1234",
      "sellerName" : "testA"
    },
    "trade|1570467885" : {
      "amount" : 1,
      "buyerId" : "4545",
      "buyerName" : "testC",
      "date" : 1570467885,
      "item" : 7,
      "price" : 2,
      "sellerId" : "1234",
      "sellerName" : "testA"
    }
  }
}

Правила моей базы данных:

{
    "rules": {
    "currentVersion" : {
        ".write" : false,
        ".read" : true     
    },
    "trading" : {
      ".read" : true,
      "$trade" : {
        ".write" : "!data.exists()",
        "buyerName" : {
          ".write" : "data.val() == '' && newData.val() != ''"
        },
        "buyerId" : {
          ".write" : "data.val() == '' && newData.val() != ''"
        },
        "sellerName" : {
          ".write" : false
        },
        "sellerId" : {
          ".write" : false
        },
        "amount" : {
          ".write" : false
        },
        "item" : {
          ".write" : false
        },
        "price" : {
          ".write" : false
        }

      }
    }
  }
} 

1 Ответ

0 голосов
/ 07 октября 2019

Это выглядит странно для меня:

if (!reference.Child("trading").Child("trade|" + currentTrade.date).Child("buyerId")
  .SetValueAsync(userId).IsCanceled)

Поскольку вы звоните SetValueAsync, значение устанавливается для базы данных асинхронно. Вероятность того, что IsCanceled будет true сразу после вашего звонка на SetValueAsync, невероятно мала.

Как объясняет документация по , когда вы фиксируете ваши данные , вам понадобитсячтобы дождаться завершения Task, который возвращается из SetValueAsync.

Примерно так:

reference.Child("trading").Child("trade|" + currentTrade.date).Child("buyerId")
  .SetValueAsync(userId).).ContinueWith(task => {
        if (task.IsFaulted)
        {
            // Handle the error...
        }
...