Firebase получить текущую стоимость записи - PullRequest
0 голосов
/ 13 октября 2018

в моем приложении есть запись о счете, которая должна подсчитывать каждый голос пользователя.Поэтому, если пользователь проголосует, значение 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);

Но как я могу использовать значение определенной записи?

При этом я получаю сообщение об ошибке

@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

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Вы должны сделать имя узла точно таким же, оно должно быть 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();
                            }
                        }
0 голосов
/ 13 октября 2018

После проверки вашей структуры вы можете использовать что-то вроде этого для изменения первого 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...