2017-02-17 9 views
2

Я создал для своих пользователей активность для ввода сообщений в базу данных Firebase и другого действия для случайного вызова сообщений. Однако я не мог заставить случайный метод работать ... метод отзыва просто вызывает одни и те же сообщения снова и снова при нажатии.получение случайного значения из базы данных Firebase

Я использую и редактирование метод, имя пользователя ничтожество размещена здесь get random value android firebase java , так что я на самом деле не понимаю, как это работает ...

Вот код для записи в базу данных:

public class PostActivity extends AppCompatActivity { 

    private EditText PostField; 
    private Button postSubmit; 
    private DatabaseReference mDatabasePosts; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_post); 

     postSubmit = (Button)findViewById(R.id.postSubmit); 
     postField = (EditText)findViewById(R.id.postField); 
     mDatabasePosts = FirebaseDatabase.getInstance().getReference().child("posts"); 

     postSubmit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       startPosting(); 
      } 

      private void startPosting() { 
       final String postVal = postField.getText().toString().trim(); 
       if (!TextUtils.isEmpty(postVal)) { 

        //post creation 
        DatabaseReference newPost = mDatabasePosts.push(); 
        newPost.setValue(postVal); 
        Toast.makeText(PostActivity.this, "Post registered", Toast.LENGTH_SHORT).show(); 

        startActivity(new Intent(PostActivity.this, HomeActivity.class)); 
       } 
      } 
     }); 
    } 
} 

ничего фантазии нет ...

На загрузочном мероприятии у меня есть кнопка, в которой будет отображаться тост случайно (ну ... по крайней мере, цель) текстов, записанных в базу данных ... вот код для этого ctivity:

DatabaseReference mPost; 

mPost = FirebaseDatabase.getInstance().getReference().child("posts"); 

button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       mPost.addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         long allNum = dataSnapshot.getChildrenCount(); 
         int maxNum = (int)allNum; 
         int randomNum = new Random().nextInt(maxNum); 

         int count = 0; 
         Iterable<DataSnapshot> ds = dataSnapshot.getChildren(); 
         Iterator<DataSnapshot> ids = ds.iterator(); 
         String newPost = (String) ids.next().getValue(); 
         while(ids.hasNext() && count < randomNum) { 
          ids.next(); 
          count ++; // used as positioning. 
         } 

         Toast.makeText(HomeActivity.this, newPost,Toast.LENGTH_SHORT).show(); 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }); 
      } 
     }); 

База данных выглядит следующим образом:

posts 
    L random key: "text 1" 
    L random key: "text 2" 
    L random key: "text 3" 
    L random key: "text 4" 
    L random key: "text 5" 
    L random key: "text 6" 

Так что на данный момент, каждый раз, когда я нажимаю на кнопку ... он продолжает вызова «текст 1» Я хочу, чтобы позвонить текст 1 и 2 поочередно и случайным образом ...

Может ли кто-нибудь мне помочь?

ответ

1

База данных выглядит следующим образом:

posts 
     L random key: "text 1" 
     L random key: "text 2" 

Так что на данный момент, каждый раз, когда я нажимаю на кнопку ... он продолжает вызова «текст 1» Я хочу, чтобы позвонить текст 1 и 2 поочередно и в случайном порядке ...

Вы используете:

int randomNum = new Random().nextInt(maxNum); 

где maxNum = 2 поскольку в вашей базе данных 2 детей.

Как the documentation говорит, этот метод возвращает вызов «псевдослучайных равномерно распределенная величина ИНТ от 0 до (включительно) и заданного значения (эксклюзивный)».
Это означает, что вы получите цифры от 0 до 1 в вашем случае.

Так как вы делаете это:

while(ids.hasNext() && count < randomNum) { 

вы переборе от 0 до 1, это означает только text1 м жет.

Вообще говоря, если вам нужно генерировать числа от min до max (включая оба), вы пишете

random.nextInt(max - min + 1) + min 
+0

Большое спасибо за помощь. Я добавляю больше детей к ребенку «постов», но безрезультатно ... Я все еще получаю только значение первого ребенка. Выполняю ли я это правильно? 'long allNum = dataSnapshot.getChildrenCount(); int maxNum = (int) allNum; int minNum = 1; int randomNum = new Random(). NextInt (maxNum - minNum + 1) + minNum; int count = 0' большое спасибо! – Jagmaster

+0

Извините ... попробовал после форматирования комментариев, но все еще не могу получить формат кода ... – Jagmaster

+0

Я не понимаю эту строку Iterator ids = ds.iterator(); Сколько элементов имеет итератор? –

0

так и в случае, если кто также пытается получить случайные значения из набора данных из Firebase базы данных , вот как вы это делаете

DatabaseReference mPost; 

    mPost = FirebaseDatabase.getInstance().getReference().child("posts"); 

    button.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 

        mPost.addListenerForSingleValueEvent(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          long allNum = dataSnapshot.getChildrenCount(); 
          int maxNum = (int)allNum; 
          int minNum = 1; 
          int randomNum = new Random().nextInt(maxNum - minNum + 1) + minNum; 

          int count = 0; 
          Iterable<DataSnapshot> ds = dataSnapshot.getChildren(); 
          Iterator<DataSnapshot> ids = ds.iterator(); 
          String newPost = ""; 

          while(ids.hasNext() && count < randomNum) { 
           newPost = (String) ids.next().getValue(); 
           count ++; // used as positioning. 
          } 
          //String msg = newPost.get("boosts").toString(); 
          Toast.makeText(HomeActivity.this, newPost,Toast.LENGTH_LONG).show(); 
} 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 
       } 
      });