Чтение данных из базы данных и сохранение их во ViewModel - PullRequest
0 голосов
/ 17 апреля 2020

В моем приложении в Android я читаю данные из базы данных реального времени Firebase и использую их для установки маркеров в представлении моей карты Google.

Кроме того, я прохожу онлайн-курс по разработке Android и узнал о ViewModel .

У меня вопрос : Когда я читаю данные, я должен сохранить их в подклассе ViewModel , чтобы я прочитал данные один раз?

Пока я читаю данные каждый раз, когда вызывается my MapsActivity и добавляются маркеры на карту.

Функция чтения данных в Класс базы данных :

fun readFromDatabase(type: String, callBack: OwnerListCallBack) {
    when (type) {
        OWNERS -> {
            ownerRef.addValueEventListener(object : ValueEventListener {
                override fun onDataChange(dataSnapshot: DataSnapshot) {
                    // This method is called once with the initial value and again
                    // whenever data at this location is updated.
                    for (snapshot: DataSnapshot in dataSnapshot.children) {
                        val owner = snapshot.getValue(Owner::class.java)

                        Log.d(TAG, "readFromDatabase: onDataChange: owner's name is ${owner?.name}")
                        if (owner != null)
                            owners.add(owner)
                        Log.d(TAG, "readFromDatabase: onDataChange: owner's name is ${owners[0].name}")
                    }
                    callBack.onCallBack(owners)

                }

                override fun onCancelled(error: DatabaseError) {
                    // Failed to read value
                    Log.w(TAG, "Failed to read value.", error.toException())
                }
            })
        }

устанавливает маркеры, которые вызывается на onMapReady функция на MapsActivity класс :

private fun setRestaurantsOnMap() {
    val marker = BitmapDescriptorFactory.fromResource(R.drawable.twotone_local_cafe_white_18dp)

    val context = this
    Log.d(TAG, "setRestaurantsOnMap: called")
    // Set markers on the map. The owner's restaurants.
    database.readFromDatabase(OWNERS, object: OwnerListCallBack {
        override fun onCallBack(owners: ArrayList<Owner>) {
            if (owners.isNotEmpty()) {
                for (owner in owners) {
                    try {
                        val ownerAddress = owner.getRestaurant().getAddress()
                        Log.d(TAG, "setRestaurantsOnMap: owner's address is: ${ownerAddress.getAddress()}")
                        val latlng = getLocationFromAddress(context, ownerAddress.getAddress())
                        Log.d(TAG, "setRestaurantsOnMap: latitude is - ${latlng?.latitude}, longitude is - ${latlng?.longitude} ")
                        if (latlng != null) {
                            mMap.addMarker(MarkerOptions()
                                .position(latlng)
                                .title(owner.getRestaurant().getName())
                                .snippet(owner.getRestaurant().getAddress().getAddress())
                                .icon(marker)
                            )
                            mMap.moveCamera(CameraUpdateFactory.newLatLng(latlng))
                        } else {
                            Log.d(TAG, "setRestaurantsOnMap: latlng is null")
                        }
                    } catch (e: NullPointerException) {
                        e.printStackTrace()
                    } catch (e: IndexOutOfBoundsException) {
                        e.printStackTrace()
                    }
                }
            }
        }
    })
...