FIRESTORE постоянные данные

говоря о постоянных данных firestore, позволяет предположить, что у пользователя нет возможности подключения при первом запуске приложения. Я добавляю некоторые данные в базу данных Firestore (например, userID ..), я могу вернуть ее с помощью метода get (). Теперь пользователь закрывает приложение.

  1. В следующий раз, когда он откроет приложение (все еще без подключения), сможет ли он получить ранее сохраненные данные, как если бы он был сохранен на пути sharedprefs? Я не могу четко понять, как найти правильный способ настройки фаза init с постоянными данными.

  2. У меня есть несколько фрагментов. Каждый раз, когда запускается один из них, я использую метод onResume для заполнения моих компонентов из данных (ранее сохраненных в sharedpref). Когда я устанавливаю Firestore getData, требуется время для извлечения. Поэтому, если пользователь переходит от текущего фрагмента к другому, у меня есть ошибки о том, что компоненты являются нулевыми или недоступными в момент завершения результата из базы данных, когда связь включена.

    Каким был бы лучший способ реализовать такое обновление данных «onResume»?

ОБНОВИТЬ :

Вот часть кода в: MainAvtivity .kt

FirebaseFirestore.getInstance().firestoreSettings.isPersistenceEnabled sightingsDatabase = FirebaseFirestore.getInstance() docname=FireStoreSetup().setupFB(sightingsDatabase!!,this) 

класс объекта kotlin для заполнения моего документа:

 data class Sighting(var userID: String, var sig_wit_situation_type: Int, var sig_env_background_type: Int, var sig_ground_type: Int, var sig_YYYY: String, var sig_MM: String, var sig_DD: String, var sig_time_start: String, var sig_date_time: String, var sig_duration_hms: String, var sig_duration_milli: Int, var sig_weather_full: Int, var sig_temp: Int) 

в классе FireStoreSetup : при первом запуске init ->

 val sighting = Sighting(deviceId!!, 0, 0, 0, strDate.substring(0, 4), strDate.substring(5, 7), strDate.substring(8, 10), strDate.substring(11), strDate, "00:00:00", 0, 0, 0) db.collection("users").document(docname!!) .set(sighting) .addOnSuccessListener { Log.d(_tag, "DocumentSnapshot successfully written!") setShared(context,"doc_name",docname!!)} .addOnFailureListener { e -> Log.w(_tag, "Error writing document", e) } 

то весело писать данные на сервер

 fun addValue(key:String,value:Any?){ val docData = HashMap<String,Any?>() docData.put(key, value) FirebaseFirestore.getInstance().collection("users").document(docname!!) .set(docData, SetOptions.merge()) } 

а также

  fun readValue(){ val docRef = FirebaseFirestore.getInstance().collection("users").document(docname!!) docRef.addSnapshotListener(object:EventListener<DocumentSnapshot> { override fun onEvent(snapshot:DocumentSnapshot?, e:FirebaseFirestoreException?) { if (e != null) { Log.w("firestore", "Listen failed.", e) } if (snapshot != null && snapshot.exists()) { Log.d("firestore", "Current data: " + snapshot.getData()) FragmentHome.vars=snapshot.getData() } else { Log.d("firestore", "Current data: null") } } }) } 

в FragmentHome :

 companion object { val itemsMenu = ArrayList<MenuData>() var vars: MutableMap<String,Any>? =null fun newInstance(value: Int): FragmentHome { val args = Bundle() args.putInt("menu", value) val fragment = FragmentHome() fragment.arguments = args return fragment } } override fun onResume() { super.onResume() FireStoreSetup().readValue() when (_menu){ 0-> switchRecycler(1,0) 1-> switchRecycler(0,0) } } 

а затем из фрагмента Home, заменив его новым фрагментом значениями firestore:

 val situ= vars!!["sig_wit_situation_type"].toString().toInt() val env= vars!!["sig_env_background_type"].toString().toInt() val grd= vars!!["sig_ground_type"].toString().toInt() reFrag(FragmentSitu.newInstance(situ,env,grd), 1) 

где в новом фрагменте FragmentSitu мы имеем:

 companion object { fun newInstance(situ: Int,env: Int,grd: Int): FragmentSitu { val args = Bundle() args.putInt("sig_wit_situation_type", situ) args.putInt("sig_env_background_type", env) args.putInt("sig_ground_type", grd) val fragment = FragmentSitu() fragment.arguments = args return fragment } } 

и он работает без задержек, онлайн и офлайн, благодаря Franck и docRef.addSnapshotListener.

** Должен быть лучший способ поймать snapshot.getData() результат изнутри onEvent(snapshot:DocumentSnapshot?) , Так как мне хотелось бы установить мои фрагменты args FragmentSitu.newInstance (situ, env, grd) непосредственно из snapshot.getData()["situ"] , snapshot.getData()["env"]

firebaser здесь

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

Когда ваше приложение сначала пытается прочитать данные из Firestore, он пытается установить соединение с его серверами. Если вы используете вызовы get() для чтения данных, Firestore будет ждать, пока это соединение будет установлено или не будет выполнено до того, как оно вернет данные. Это означает, что для этого первоначального вызова может потребоваться довольно много времени. Мы знаем, что это может привести к нежелательному поведению пользователей вашего приложения, поэтому мы рассматриваем способы улучшения этого поведения.

В то же время подумайте о том, чтобы использовать слушателей в режиме реального времени для чтения одних и тех же данных. Эти слушатели ведут себя по-разному в этом сценарии и будут / могут дать результат дважды:

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

Как говорится в официальной документации ,

Cloud Firestore поддерживает автономное сохранение данных. Эта функция кэширует копию данных Cloud Firestore, которую активно использует ваше приложение, поэтому ваше приложение может получить доступ к данным, когда устройство находится в автономном режиме.

Но для того, чтобы использовать эту функцию, вам нужно хотя бы одно соединение с dabase. Это означает, что ваше приложение должно быть подключено к Интернету хотя бы один раз. После этого вы сможете писать, читать, слушать и запрашивать кэшированные данные.

Если вы хотите использовать данные между действиями или фрагментами, я рекомендую вам использовать либо Intent либо SharedPreferences , которые могут хранить ваши данные во всем приложении.

Intereting Posts