Суть в том, что я пишу приложение, чтобы при нажатии на кнопку в приложении человек получал промо-код из массива в базе данных и удалял эту полученную строку, но при этом возникла проблема, в то время как одновременно (или в течение 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());
}
}
});
}
});