настройка правил безопасности в Cloud Firestore - PullRequest
0 голосов
/ 15 марта 2019

Суть в том, что я пишу приложение, чтобы при нажатии на кнопку в приложении человек получал промо-код из массива в базе данных и удалял эту полученную строку, но при этом возникла проблема, в то время как одновременно (или в течение 1-2 секунд) на разных устройствах получено одно и тоже значение, так как оно просто не успевает удалить из базы, поэтому в правилах безопасности можно попросить пользователей обратиться к базе данных по одному или как-то решить эту проблему? Заранее спасибо

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    Button mButtonGive;
    Button mButtonGiveIvi;
    TextView mTextPromo;
    TextView mTextPromoIvi;

    FirebaseFirestore mRef = FirebaseFirestore.getInstance();
    DocumentReference mDelRef = mRef.collection("Promocode").document("Delivery");
    DocumentReference mIviRef = mRef.collection("Promocode").document("Ivi");


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButtonGive = findViewById(R.id.mButtonGive);
        mButtonGiveIvi = findViewById(R.id.mButtonGiveIvi);
        mTextPromo = findViewById(R.id.mTextPromo);
        mTextPromoIvi = findViewById(R.id.mTextPromoIvi);

        mButtonGive.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mDelRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                            if (task.isSuccessful()) {
                                DocumentSnapshot document = task.getResult();
                                assert document != null;
                                if (document.exists()) {
                                    Log.d(TAG, "DocumentSnapshot data: " + document.getData());
                                    List<String> promocodes;
                                    promocodes = (List<String>) document.get("Promocode");
                                    Log.d(TAG, "Promocodes: " + promocodes);
                                    if (promocodes.size() > 0) {
                                        mTextPromo.setText(promocodes.get(0));
                                        mDelRef.update("Promocode", FieldValue.arrayRemove(promocodes.get(0)));
                                    } else {
                                        mTextPromo.setText("Промокоды кончились");
                                        Log.d(TAG, "No Promo");
                                    }
                                } else {
                                    Log.d(TAG, "No such document");
                                }

                            }
                            else {
                                Log.d(TAG, "get failed with ", task.getException());
                            }
                    }

                });
            }
        });

1 Ответ

0 голосов
/ 15 марта 2019

Поскольку вы не разместили ни кода, ни какого-либо фрагмента своей программы:

Я предполагаю, что вы отправляете код пользователю, и он должен ввести его в приложение.Создайте еще один массив, в котором вы будете отслеживать отправленные коды, которые еще не использовались в приложении: например, promoCodes [] и sentCodes [].Как только вы захотите отправить другой код, вы должны проверить, есть ли код в sentCodes [] и promoCodes [], чтобы не отправлять дубликаты.

(Было бы проще, если вы прикрепите часть кода илилучше сформулируйте свой вопрос)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...