Можно ли получить данные карты хеш-кода из базы данных Firebase и вставить их в представление списка? - PullRequest
0 голосов
/ 15 апреля 2019

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

Я новичок в firebase и отслеживаю проблемы с документацией и поиском, с которыми сталкиваюсь, у меня есть hashmap на моем сервере. Отметка времени и отправка ее в отдельные места в базе данных Firebase, одна из которых была разогнана, а другая разогнана, под ID сотрудника. Я просто не могу изменить данные из hashmap в long и затем показать в таблице.

Вот как я hashmap'd и отправил данные в базу данных Firebase.

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Initialise Firebase
        FirebaseApp.initializeApp(this);


        //find button
        btn_sign_out = (Button)findViewById(R.id.btn_sign_out);
        btn_sign_out.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Logout
                AuthUI.getInstance()
                        .signOut(MainActivity.this)
                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                btn_sign_out.setEnabled(false);
                                showSignInOptions();
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Toast.makeText(MainActivity.this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
                }
            }


        );
        // Assign button variables to the buttons
        btn_clock_in = (Button)findViewById(R.id.btn_clock_in);
        btn_clock_out = (Button)findViewById(R.id.btn_clock_out);
        btn_view_diary = (Button)findViewById(R.id.btn_shift_diaray);

        btn_view_diary.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, shift_diary.class));
            }
        });
        btn_clock_out.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Select Root of Database

                FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                user_information = FirebaseDatabase.getInstance().getReference();
                /*HashMap<String, Object> clockMap = new HashMap<>();

                clockMap.put("Clock out Time" + 1, ServerValue.TIMESTAMP);*/


                user_information.child(user.getUid()).child("Clock_out").push().setValue(clockMap).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()){
                            Toast.makeText(MainActivity.this, "Clocked Out Successfully", Toast.LENGTH_SHORT).show();
                            btn_clock_in.setEnabled(true);
                            btn_clock_out.setEnabled(false);
                        } else {
                            Toast.makeText(MainActivity.this, "Clock Out unsuccessful please try again!", Toast.LENGTH_SHORT).show();
                        }
                    }
                });

            }

        });

        btn_clock_in.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Select Root of Database
                user_information = FirebaseDatabase.getInstance().getReference();
                FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

                HashMap<String, Object> dataMap = new HashMap<>();

                dataMap.put("Clock in Time" + 1, ServerValue.TIMESTAMP);

                user_information.child(user.getUid()).child("Clock_In").push().updateChildren(dataMap).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()){
                            Toast.makeText(MainActivity.this, "Clocked In Successfully", Toast.LENGTH_SHORT).show();
                            btn_clock_in.setEnabled(false);
                            btn_clock_out.setEnabled(true);
                        } else {
                            Toast.makeText(MainActivity.this, "Clock in unsuccessful please try again!", Toast.LENGTH_SHORT).show();
                        }
                    }
                });

            }
        });`

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

1 Ответ

0 голосов
/ 15 апреля 2019

Мое здравое суждение побуждает меня игнорировать этот вопрос, но я обожаю firebase и думаю, что больше людей должны использовать его, поэтому я сделаю это как можно лучше.

Кратчайший ответ, который я могу дать на ваш вопросэто и «да» и «нет».

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

СначалаЯ подробно остановлюсь на «да» и «нет» ...

Да: вы можете хранить данные, содержащиеся в Java HashMap, и находить / извлекать их непосредственно из Firebase способом, который концептуально очень похож на способРаботает Java HashMap.

No: Firebase хранит документы JSON, не типизированные объекты и структуры данных, характерные для среды выполнения приложения, такой как HashMap.Для отображения данных, хранящихся в firebase, в хэш-карту Java потребуется некоторая дополнительная логика

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

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

user_information.child(user.getUid()).child("Clock_out").push().setValue(clockMap)
user_information.child(user.getUid()).child("Clock_In").push().updateChildren(dataMap)

ваши данные в конечном итоге будут формироватьсячто-то вроде этого, когда рассматривается как JSON:

{    
       "user_information": 
       {  
           "SomeId1":
           {   
              "Clock_out":  {   "Clock out Time1": "SomeTimestamp",
                                "Clock out Time2": "SomeTimestamp",
                                ...
                                "Clock out TimeN": "SomeTimestamp"   },
              "Clock_In": {  "Clock in Time1": "SomeTimestamp",
                             "Clock in Time2": "SomeTimestamp",
                             ...
                             "Clock in TimeN": "SomeTimestamp"  } 
            }, 
             ...
           "SomeIdN":
           {   
              "Clock_out":  {   "Clock out Time1": "SomeTimestamp",
                                "Clock out Time2": "SomeTimestamp",
                                ...
                                "Clock out TimeN": "SomeTimestamp"   },
              "Clock_In": {  "Clock in Time1": "SomeTimestamp",
                             "Clock in Time2": "SomeTimestamp",
                             ...
                             "Clock in TimeN": "SomeTimestamp"  } 
            }, 
       }
}

Надеюсь, я не слишком далеко от цели вашей организационной структуры, и, предположив, что нет, я сейчас скажу вам, что считаю, что это не такфантастическая стратегия.Я основываюсь на прошлом опыте, связанном с разработкой программного обеспечения для отслеживания времени самостоятельно.Но я оставлю все как есть и скажу, что вы можете обращаться ко мне за советом по методам организации, только если вы этого хотите.Однако, прежде чем вы сможете получить какие-либо данные из firebase для использования в просмотре списка, вам сначала нужно будет поместить их туда, и предоставленный вами код не сможет этого сделать, но он близок.Итак, во-первых, вам нужно будет заставить этот код работать и публиковать данные в firebase.

Одна из рекомендаций, которую я имею, состоит в том, чтобы после добавления нового элемента в список часов пользователя в списке, было бы либо временносохраните ключ, сгенерированный firebase для этого входа, локально или найдите его позже и используйте его в качестве ключа для соответствующего времени в списке пользователей.

IE

String key = user_information.child(user.getUid()).child("Clock_In").push().getKey();   
// key variable now contains an id under which you can store your clock in/out timestamps
user_information.child(user.getUid() + "/Clock_In/" + key).setValue(ServerValue.TIMESTAMP);

И позже, когда запрашивается тайм-аут:

// key variable is the same value you were given by firebase during clock-in, you'll need to recall that value somehow
      user_information.child(user.getUid() + "/Clock_out/" + key).setValue(ServerValue.TIMESTAMP);

Причина, по которой я рекомендую этот подход, заключается в том, что даже если объекты Clock_out и Clock_in ведут себя как списки, при работе с ними через firebase онина самом деле нет.Они хранятся в виде стандартных ключей / значений, содержащих объекты, и получение бесплатных пар тактов / выходов было бы гораздо более эффективным, если бы каждая пара была проиндексирована с использованием одного и того же ключа.

После того, как у вас есть некоторые данные в базе данных Firebase и вы готовы извлечь их для просмотра списка, вы можете восстановить их, используя некоторые из предоставленных фильтров, например

limitToLast()

Полный пример:

 Query results = user_information.child(user.getUid() + "/Clock_In").limitToLast(10);


results.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
         // Clear your list view, it's about to be repopulated
        for (DataSnapshot clockIn: dataSnapshot.getChildren()) {
             String clockOut = user_information.child(user.getUid() + "/Clock_out/" + clockIn.getKey()).getValue();
             // Add clockIn.getValue() and clockOut to your listview here
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // ...
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...