2016-09-21 4 views
1

У меня есть база данных в Firebase для Android, и у меня есть объект с атрибутами, которые вы видите на изображении. Объект хранится в базе данных с помощью следующего кода:Как предотвратить дублирование данных в базе данных Firebase для Android

FirebaseUser user = mAuth.getCurrentUser(); 
String videoId = getIntent().getStringExtra("VIDEO_ID"); 
minuto = player.getCurrentTimeMillis(); 
Watching watching = new Watching(user.getUid(), videoId, String.valueOf(minuto)); 
DatabaseReference mRef = database.getReference().child("Watching").push(); 
mRef.setValue(watching); 

Проблема у меня есть, как я использую push() для хранения узлов я с повторяющимися данными, как вы можете видеть на изображении.

enter image description here

Есть ли способ избежать хранения дубликатов данных? Зная, что у меня нет собственного идентификатора для хранения.

Любая помощь?

+0

Я думаю, это зависит, в каких условиях вы решили нажать, если я вам буду запрос по idUser и есть список всех Смотря пунктов на местном уровне и, прежде чем я решил нажать я буду проверять, если idVideo существует в моем списке , – KgaboL

+0

На следующий вопрос: вы включили в дерево вопрос о дереве JSON. Пожалуйста, замените это на фактический JSON как текст, который вы легко можете получить, нажав кнопку «Экспорт» в консоли базы данных Firebase. Наличие JSON в качестве текста делает его доступным для поиска, позволяет нам легко использовать его для тестирования с вашими фактическими данными и использовать его в нашем ответе, и в целом это просто хорошая вещь. –

ответ

2

Это зависит от того, как вы определяете дубликат.

Обычный случай, когда люди задают этот вопрос, когда они хранят пользователей. Там определение дубликата прост: если два пользовательских объекта имеют одинаковое значение для uid, они являются одним и тем же пользователем. Поэтому в этом случае вы должны хранить пользователей под их uid, а не под идентификатором push.

То же самое относится и к вашей ситуации. Если один пользователь может смотреть только одно видео, хранить узлы под Watching в uid пользователя:

Watching 
    "NX7...A33" 
     "idVideo": "b13...o4s" 
     "minute": "0" 

Но если это сочетание uid + idVideo, который является уникальным, хранить узлы под комбинированным ключом :

Watching 
    "NX7...A33_b13...o4s": "0" 

Теперь вы можете легко предотвратить дубликаты, с помощью setValue() вместо push():

String key = user.getUid() + "_" + videoId; 
ref.child("Watching").child(key).setValue(String.valueOf(minuto)); 
0

Я столкнулся с такой же проблемой, как и вы, и вот как я это понимаю. Я проверяю адрес электронной почты, который вводил пользователь, с тем, который был сохранен в моем db.if любое найденное совпадение, а затем показывает тост, что электронная почта уже существует в противном случае, с новым ключом.

mFirebaseDatabase.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(final DataSnapshot dataSnapshot) { 
       for (DataSnapshot data : dataSnapshot.getChildren()) { 
       //If email exists then toast shows else store the data on new key 
        if (!data.getValue(User.class).getEmail().equals(email)) { 
         mFirebaseDatabase.child(mFirebaseDatabase.push().getKey()).setValue(new User(name, email)); 
        } else { 
         Toast.makeText(ChatListActivity.this, "E-mail already exists.", Toast.LENGTH_SHORT).show(); 
        } 
       } 
      } 

      @Override 
      public void onCancelled(final DatabaseError databaseError) { 
      } 
     }); 
Смежные вопросы