有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Firebase获取值并更改/更新它

我以前问过几乎相同的问题。但答案不是那么好,或者说还不够好。我想重新开始,现在我有很多问题

这是邮局

Making a database-voting app

所以现在我有另一个想法

这一次只有一个计算投票数的值,但应用程序没有得到“count”值的实际数量

这是我的密码:

database = FirebaseDatabase.getInstance();
names= database.getReference("Test");

final Name name = new Name(txtName.getText().toString(), score);
names.addListenerForSingleValueEvent(new 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();
                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {
                            }
                        });

                        Toast.makeText(Result.this, "Thank you for voting", Toast.LENGTH_SHORT).show();

                        Intent homeIntent3 = new Intent(Result.this, StartActivity.class);
                        startActivity(homeIntent3);
                    }
                });

 

这是数据库

enter image description here

因此,如果这个名字不存在,我可以很容易地用score=1或score=-1添加上/下投票

但如果名称存在,则更改分数值时会出现问题

应用程序正在崩溃,出现以下错误

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 安卓.os.Handler.handleCallback(Handler.java:789)
                  at 安卓.os.Handler.dispatchMessage(Handler.java:98)
                  at 安卓.os.Looper.loop(Looper.java:251)
                  at 安卓.app.ActivityThread.main(ActivityThread.java:6589)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.安卓.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                  at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:767)

这是代码中的错误行

score = dataSnapshot.child("Test").child("Name").getValue(long.class);

我不是数据库编程方面的专家,但有什么问题吗? 错孩子了

我还尝试将“score”保存为字符串,并将其解析为长值。但这也不起作用


共 (1) 个答案

  1. # 1 楼答案

    你没有得到任何东西,因为你的Name属性的名称在每个子项中都是不同的。要解决此问题,您应该在每个子项下使用相同的名称,如下所示:

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

    请参见,name属性的名称现在总是name不是name1、name2等等

    要获取所有对象中的score属性值,请使用以下代码行:

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

    logcat中的输出将为:

    Score: 0
    Score: 15
    

    还请注意,我已经传递给了getValue(Long.class)Long类,而不是原语long

    编辑:

    要编辑单个条目,则应使用以下代码行:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    Map<String, Object> map = new HashMap<>();
    map.put("score", 5);
    rootRef.child("test").child("Name1").updateChildren(map);
    

    第一个对象中的score属性将从0更改为5。如果您认为您的score属性将在多用户环境中更新,那么您应该使用FirebaseTransactions,正如我在本post中解释的那样