Как избежать избыточности в Firebase

есть ли возможность избежать избыточности в базе данных 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"
  },

Заранее спасибо, ребята!

Вы можете показать нам структуру своей базы данных?

Levi Moreira 25.07.2018 14:32
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
1
59
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вам нужно использовать запрос, чтобы проверить, существует ли значение в базе данных:

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)"? Так что второе? Я добавил структуру базы данных в вопросе вверху.

Hansi 26.07.2018 09:36

это второй String second = sp2.getItemAtPosition(m).toString();, который вы добавляете в equalTo, чтобы проверить, находится ли эта строка в базе данных или нет @Hansi

Peter Haddad 26.07.2018 09:39

ОК. Но в этом случае вторая строка - это всего лишь одно случайное слово (случайная буква, потому что «м»). Но как я могу проверить, находится ли строка out (String out = first + second;) в базе данных? Можно ли вообще проверить это с помощью этих отметок времени?

Hansi 26.07.2018 10:09

Да, вы спросили: «Как я могу проверить, есть ли случайно выбранное слово в базе данных или нет?». И вот каков ответ: если, допустим, слово «дом», то если вы сделаете orderByChild («randomWord1»). EqualTo («house»), он проверит, есть ли «дом» в базе данных, а затем проверьте, существует ли этот снимок данных в базе данных @Hansi

Peter Haddad 26.07.2018 10:12

Спасибо. Но, к сожалению, в моем случае это не работает. Я добавил в раздел if объект ToastText, а затем сделал инструкцию else, которая открывает метод, добавляющий слово в базу данных. Но в любом случае - даже если слово уже существует - приложение добавляет слово в базу данных. Извините, я не джинн программирования: D

Hansi 26.07.2018 10:46

используйте .addValueEventListener(new ValueEventListener(){ вместо .addListenerForSingleValueEvent(new ValueEventListener() {

Peter Haddad 26.07.2018 10:51

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);
    }
});

Также посмотрите некоторые из этих предыдущих ответов:

Другие вопросы по теме