【问题标题】:Firebase get current value of an entryFirebase 获取条目的当前值
【发布时间】:2018-10-13 18:29:35
【问题描述】:

在我的应用程序中有一个分数条目,它应该计算用户的每一票。因此,如果用户投票赞成,score 的值会增加约 1。

我知道如何设置新值,但无法获取当前条目。

因此,我可以记录实际分数:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("test").orderByChild("name");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    for(DataSnapshot ds : dataSnapshot.getChildren()) {
        long score = ds.child("score").getValue(Long.class);
        Log.d(TAG, "Score: " + score);
    }
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
    Log.d(TAG, databaseError.getMessage());
}
};
query.addListenerForSingleValueEvent(valueEventListener);

但是我怎样才能使用某个条目的值呢?

这样我得到一个错误

@Override
    public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
        if (dataSnapshot.child(name.getName()).exists()) {
            up.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    names.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            score = dataSnapshot.child("Test").child("Name").getValue(long.class);
                            score += 1;
                            final Name name = new Name(txtName.getText().toString(), score);
                            try {
                                names.child(name.getName()).setValue(name);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }

错误信息:

java.lang.NullPointerException: Attempt to invoke virtual method 'long java.lang.Long.longValue()' on a null object reference
              at user.prof.name.Activities.Result$1$1$1.onDataChange(Result.java:80)
              at com.google.firebase.database.obfuscated.zzap.zza(com.google.firebase:firebase-database@@16.0.3:75)
              at com.google.firebase.database.obfuscated.zzca.zza(com.google.firebase:firebase-database@@16.0.3:63)
              at com.google.firebase.database.obfuscated.zzcd$1.run(com.google.firebase:firebase-database@@16.0.3:55)
              at android.os.Handler.handleCallback(Handler.java:789)
              at android.os.Handler.dispatchMessage(Handler.java:98)
              at android.os.Looper.loop(Looper.java:251)
              at android.app.ActivityThread.main(ActivityThread.java:6589)
              at java.lang.reflect.Method.invoke(Native Method)
              at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

你有什么想法吗?

编辑:

结构如下:

Firebase-root
  |
  --- test
       |
       --- Name1
       |     |
       |     --- name: "Name1"
       |     |
       |     --- score: 0
       |
       --- Name2
             |
             --- name: "Name2"
             |
             --- score: 15

【问题讨论】:

  • 你会添加firebase数据库结构吗?似乎 long 返回 null。也许查询有问题或什么?但是,Test 使用的是大写字母,但在上面的代码中是小写字母。无论如何,不​​检查结构就无法帮助..
  • 我已经更新了帖子。谢谢你。 Test 应该大写还是小写?

标签: java android firebase firebase-realtime-database


【解决方案1】:

检查你的结构后,你可以使用类似这样的东西来改变第一个Name1(例如):

score = dataSnapshot.child("test").child("Name1").child("score").getValue();

然后通过setValue()设置你的数据。

请注意,这仅在您的查询没有任何问题并且首先获取参考开始时才有效。

更新:您可能需要使用addListenerForSingleValueEvent 来避免循环。

DatabaseReference myRef = FirebaseDatabase.getInstance().getReference().child("test"); 
ref.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot snapshot) {

                score = dataSnapshot.child("Name1").child("score").getValue();

                ...
                // and the rest

【讨论】:

  • 随时乐意提供帮助。使用addListenerForSingleValueEvent 将解决这个问题。
  • 你用这个简单的方法拯救了我的一天。再次,非常感谢你:)
【解决方案2】:

您必须使节点名称完全相同,它应该是test,我看到的是,您没有在附加代码中描述您的names 引用。你应该这样尝试:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("test").child("Name1");

ref.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            score = dataSnapshot.child("score").getValue(long.class);
                            score += 1;
                            final Name name = new Name(txtName.getText().toString(), score);
                            try {
                                names.child(name.getName()).setValue(name);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }

【讨论】:

  • 谢谢先生。它在增加,但它一直在增加,直到无限。我怎样才能避免这种情况?使用 for 循环?
  • 您可以添加类似if 的语句,其中score 大于某个点以中断该方法。
  • 如果此答案对您有所帮助,您可以将其标记为正确,我将不胜感激。干杯:)
  • @Hansi 检查我关于无限循环的答案。
  • 哦,抱歉回复晚了,那里看不到。很高兴你的问题得到解决,干杯:)
猜你喜欢
  • 2023-01-26
  • 1970-01-01
  • 2013-12-24
  • 2020-11-30
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 2017-04-06
  • 2020-03-29
相关资源
最近更新 更多