如何保存随机数值?Firebase数据库能否单次读取数据?
嘿,我来帮你搞定这两个问题~
解决方案
1. 完全不需要在Firebase数据库中保存随机数
当然可以!随机数是你在本地客户端生成的,本来就没必要存到Firebase数据库里。
如果你想要每次启动应用都生成新的随机数,直接像你现在这样生成后用就行,完全不用碰数据库:
int number = rand.nextInt(10);
要是你希望重启应用后还能用到同一个随机数,那就把它存在本地存储(比如Android的SharedPreferences)就行,没必要上传到Firebase:
// 保存随机数到本地SharedPreferences SharedPreferences prefs = getSharedPreferences("MyAppPrefs", MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putInt("savedRandomNum", number); editor.apply(); // 下次启动时读取 int savedNumber = prefs.getInt("savedRandomNum", -1); // -1是默认值,代表之前没存过 if (savedNumber != -1) { number = savedNumber; } else { // 没存过就生成新的,顺便存起来 number = rand.nextInt(10); editor.putInt("savedRandomNum", number); editor.apply(); }
这样既省了Firebase的存储空间,又能满足你对随机数的持久化需求(如果需要的话)。
2. 让Firebase数据仅读取一次
你现在用的addValueEventListener是持续监听模式——只要指定节点的数据有变化,它就会触发onDataChange。要实现“只读取一次”的需求,换成addListenerForSingleValueEvent就对了!这个方法只会获取一次当前节点的最新数据,之后自动取消监听,不会再触发回调。
修改后的代码示例:
int number = rand.nextInt(10); DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child(String.valueOf(number)); ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // 先判断节点是否存在,避免空指针异常 if (dataSnapshot.exists()) { User abc = dataSnapshot.getValue(User.class); // 这里写更新UI的逻辑 } else { // 处理随机数对应的节点不存在的情况 } } @Override public void onCancelled(DatabaseError databaseError) { // 读取失败时记录日志 Log.e("FirebaseReadError", "读取数据失败: " + databaseError.getMessage()); } });
这样就能保证读取操作只执行一次啦。
内容的提问来源于stack exchange,提问作者murattssss
相关产品推荐
相关产品推荐

