2017-02-17 74 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)); 
       } 
      } 
     }); 
    } 
} 

沒有什麼花哨的...

關於檢索活動,我有一個按鈕,它會隨機顯示一個文本(以及至少目標是)寫入數據庫的文本...這裏是該acti的代碼VITY:

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 (含)和指定值(不包括)之間均勻分佈int值」。
這意味着你會得到0到1的數字。

既然你這樣做:

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

你迭代從0到1,這意味着只有文本1伊特米。

一般來說,如果你需要生成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

這樣的情況下,任何人也試圖從火力地堡數據庫數據集中獲得隨機值,這裏是你怎麼做

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) { 

         } 
        }); 
       } 
      }); 
相關問題