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

Я ранее задавал почти такой же вопрос.Но ответ был не так хорош или просто не достаточно хорош.Я хотел начать снова, и теперь у меня много проблем.

Вот этот пост.

Создание приложения для голосования по базе данных

Итак, пока у меня есть другая идея.

На этот раз есть только одно значение, которое подсчитывает голоса, но приложение не получает фактическую сумму значения "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

Так что, если имя не 'Если я не существую, я могу легко добавить голос «за» / «против» со счетом = 1 или счетом = -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 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)

И это строка ошибки в коде

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

Я не эксперт в базе данныхпрограммирование, а что не так?Не тот ребенок?

Я также пытался сохранить «счет» в виде строки и проанализировать его в длинное значение.Но это тоже не работает.

Пожалуйста, помогите мне.Надеюсь, вы можете.

1 Ответ

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

Вы ничего не получаете, потому что имя вашего 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, а не к примитивному длинному.

Редактировать:

Для редактирования отдельной записи вам следует использовать следующие строки кода:

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 , как объяснено в моем ответе из этой записи .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...