есть ли возможность избежать избыточности в базе данных firebase?
У меня есть приложение, в котором пользователи могут добавлять первое и второе слово. С помощью кнопки вы можете получить случайное слово из этих двух слов.
Random rand = new Random();
int n = rand.nextInt(9);
Random rand1 = new Random();
int m = rand1.nextInt(8);
String first = sp.getItemAtPosition(n).toString();
String second = sp2.getItemAtPosition(m).toString();
out.setText(first + second);
Итак, я получаю слова от Спиннера (пожалуйста, не спрашивайте, почему так)
Хорошо, теперь. Как я могу проверить, есть ли случайно выбранное слово в базе данных или нет?
С инструкцией if-else?
Структура выглядит так:
{"1stWord" : {
"1stWord" : {
"-LI125GLPy0-IPAm4GEM" : {
"name" : "test"
},
Заранее спасибо, ребята!






Вам нужно использовать запрос, чтобы проверить, существует ли значение в базе данных:
ref.child("Words").orderByChild("randomWord1").equalTo(second).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
//it exists
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Предполагая, что у вас есть эта база данных:
Words
randomId
randomWord1: "words"
Итак, здесь вы используете orderByChild(), чтобы проверить, равен ли этот дочерний элемент случайному слову. Затем вы используете dataSnapshot.exists(), чтобы проверить, существуют ли данные, которые вы пытаетесь получить, в базе данных.
Благодарю за ваш ответ. Что такое "equalTo (second)"? Так что второе? Я добавил структуру базы данных в вопросе вверху.
это второй String second = sp2.getItemAtPosition(m).toString();, который вы добавляете в equalTo, чтобы проверить, находится ли эта строка в базе данных или нет @Hansi
ОК. Но в этом случае вторая строка - это всего лишь одно случайное слово (случайная буква, потому что «м»). Но как я могу проверить, находится ли строка out (String out = first + second;) в базе данных? Можно ли вообще проверить это с помощью этих отметок времени?
Да, вы спросили: «Как я могу проверить, есть ли случайно выбранное слово в базе данных или нет?». И вот каков ответ: если, допустим, слово «дом», то если вы сделаете orderByChild («randomWord1»). EqualTo («house»), он проверит, есть ли «дом» в базе данных, а затем проверьте, существует ли этот снимок данных в базе данных @Hansi
Спасибо. Но, к сожалению, в моем случае это не работает. Я добавил в раздел if объект ToastText, а затем сделал инструкцию else, которая открывает метод, добавляющий слово в базу данных. Но в любом случае - даже если слово уже существует - приложение добавляет слово в базу данных. Извините, я не джинн программирования: D
используйте .addValueEventListener(new ValueEventListener(){ вместо .addListenerForSingleValueEvent(new ValueEventListener() {
Firebase имеет свой собственный уникальный идентификатор по умолчанию, я думаю, что это будет лучший способ, потому что firebase действительно выполняет проверку и назначение, следовательно, таким образом вы уменьшаете количество кода. так что я бы посоветовал просто оставить это так. установить уникальный идентификатор на уровне документа.
Если вы хотите, чтобы определенное значение было уникальным в базе данных, самый простой способ использовать это значение в качестве ключа внутри узла. Итак, если ваши слова должны быть уникальными, создайте узел words и под ним сохраните каждое слово как ключ с фиктивным значением true. Например.
"words": {
"avoid": true,
"redundance": true
}
Поскольку ключи по определению уникальны в коллекции, это автоматически обеспечивает выполнение ваших требований.
Чтобы записать новое слово в эту коллекцию, вы должны использовать транзакцию:
DatabaseReference wordRef = FirebaseDatabase.getInstance().getReference("words/avoid");
wordRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
String word = mutableData.getValue(String.class);
if (word == null) {
mutableData.setValue("avoid");
return Transaction.success(mutableData);
}
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "writeWord completed: " + databaseError);
}
});
Также посмотрите некоторые из этих предыдущих ответов:
Вы можете показать нам структуру своей базы данных?