#android #database
#Android #База данных
Вопрос:
Суть в том, что я пишу приложение, чтобы при нажатии на кнопку в приложении человек получал промокод из массива в базе данных и удалял эту полученную строку, но возникла проблема, при этом одновременно (или в течение 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:
Поскольку вы не опубликовали код или какой-либо фрагмент вашей программы:
Я предполагаю, что вы отправляете код пользователю, и он должен ввести его в приложение. Создайте другой массив, в котором вы будете отслеживать отправленные коды, которые еще не использовались в приложении: например, промо-коды [ ] и отправленные коды [ ]. Как только вы захотите отправить другой код, вам следует проверить, есть ли код в sentCodes [] и promotionalCodes [], чтобы не отправлять дубликаты.
(Было бы проще, если бы вы лучше прикрепили часть кода или сформулировали свой вопрос)
Комментарии:
1. нет, суть более чем проста, пользователь открывает приложение, выбирает из списка приложение или сайт, для которого ему нужна скидка, нажимает на кнопку «получить», затем он смотрит рекламный ролик и после ролика у него появляется промокод, который он затем может использовать в этом сервисе
2. затем сделайте двойную проверку: сохраните код в исходном списке, пока он не будет использован, и в другом массиве, поскольку он был отправлен пользователю, но еще не использовался. Поэтому каждый раз, когда вы отправляете новый код, вы должны проверять, какие из них вы уже отправили / использовали.
3. Я понимаю, что вы хотите сказать, вы должны попробовать, спасибо
4. Нет, этот метод не помогает, проблема в том, что он не сразу удаляет или добавляет значения, и этой задержки достаточно, чтобы получить одинаковое значение на разных устройствах