Saya mencoba mendapatkan nilai penghitung, dan mengaturnya ke ID model saya, menggunakan database Firebase.

Koneksi ke database berfungsi dan metode lain juga. Sekarang saya mencoba untuk tidak harus mengatur ID secara manual untuk model saya setiap kali saya perlu menambahkan item baru.

Masalahnya adalah ValueEventListener yang seharusnya mengambil ID tidak berfungsi, artinya aplikasi tidak "memasukkan" potongan kode itu.

invia.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        final Data data = new Data();
        FirebaseDatabase database2 = FirebaseDatabase.getInstance();
        DatabaseReference myRef2 = database2.getReference("Counter/node");
        myRef2.addValueEventListener(new ValueEventListener() {
            @Override public void onDataChange(DataSnapshot dataSnapshot) {
                Counter counter = dataSnapshot.getValue(Counter.class);
                data.setId(String.valueOf(counter.getCnt_android() + 1));
            }

            @Override public void onCancelled(DatabaseError databaseError) {
                System.out.println("The read failed: " + databaseError.getCode());
            }
        });

        data.setUser(user.getText().toString());
        data.setPassword(password.getText().toString());

        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference("Information Android/");
        myRef.child(data.getId()).setValue(data);

        Counter cnt_android = new Counter();
        cnt_android.setCnt_android(Integer.parseInt(data.getId()));
        myRef2.child("cnt_android").setValue(cnt_android);
    }
});

Saya sudah mencoba meletakkan dua baris ini:

data.setUser(user.getText().toString());
data.setPassword(password.getText().toString());

Di dalam onDataChange untuk melihat apakah itu masalah dari mendapatkan nilai penghitung tetapi itu bukan karena mereka tetap nol, bahkan jika saya memberikannya dari EditBox di dalam aplikasi, jadi saya mulai berpikir bahwa ada masalah dengan kode spesifik itu.

Aplikasi mogok di baris ini:

myRef.child(data.getId()).setValue(data);

Karena tidak ada nilai untuk ID.

1
Adrian 30 Maret 2019, 12:47

1 menjawab

Jawaban Terbaik

Firebase onDataChange() bersifat asinkron, yang berarti kompilator akan pindah ke tugas berikutnya, dan kemudian ketika onDataChange() mengambil semua data, ia akan dieksekusi.

Dalam kasus Anda, setelah onDataChange(), Anda memiliki kode berikut:

 myRef.child(data.getId()).setValue(data);

Ini dieksekusi sebelum onDataChange(), oleh karena itu data.getId() mengembalikan null.

Untuk mengatasi masalah Anda, Anda perlu menambahkan kode Anda di dalam onDataChange():

    myRef2.addValueEventListener(new ValueEventListener() {
            @Override public void onDataChange(DataSnapshot dataSnapshot) {
            Counter counter = dataSnapshot.getValue(Counter.class);
            data.setId(String.valueOf(counter.getCnt_android() + 1));
            FirebaseDatabase database = FirebaseDatabase.getInstance();
            DatabaseReference myRef = database.getReference("Information Android/");
            myRef.child(data.getId()).setValue(data);

        }

        @Override public void onCancelled(DatabaseError databaseError) {
            System.out.println("The read failed: " + databaseError.getCode());
        }
    });
1
Peter Haddad 30 Maret 2019, 10:21