@nuroraf
Magician

Как синхронизировать ListView и Firebase Database?

Добрый день,

Имеется проект, который привязан к Firebase Realtime Database. Данные подгружаются в SharedPreference, затем в массив объектов и наконец в ListView. Задача - каждый раз не подключатся к Базе, а показывать пользователю данные из SharedPreference, но если произошли изменения в БД (добавление, изменение, удаление) подключиться к БД, обновить SharedPreference и показать пользователю обновленную информацию. А если у пользователя скажем отлкючен интернет, то информация у него будет, но не актуальная.

Моя идея заключается в том, чтобы проверять при запуске активити размер SharedPreference и сравнить его с размером Firebase Database, если отличаются, то запустить метод OnDataChanged и обновить SharedPreference.

Идея верная или следует по другому реализовать. Буду благодарен любой идеи решения проблемы.

Вот так реализовано на данный момент:

public class Dictionary extends AppCompatActivity {

    // Firebase db
    private DatabaseReference mDictionaryDatabase;

    // Android layout
    private ListView listViewDictionary;
    private List<DictionaryModel> arrayListDictionary;
    private DictionaryAdapter dictionaryAdapter;
    private SharedPreferences sPrefDictionary;
    String prefWord = "firebaseKey";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dictionary);


        mDictionaryDatabase = FirebaseDatabase.getInstance().getReference("dictionary");

        listViewDictionary = findViewById(R.id.listViewDictionary);
        arrayListDictionary = new ArrayList<>();

        sPrefDictionary = getSharedPreferences(prefWord, MODE_PRIVATE);


        mDictionaryDatabase.orderByChild("word").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


                for (DataSnapshot dictionarySnapshot : dataSnapshot.getChildren()){

                    DictionaryModel word = dictionarySnapshot.getValue(DictionaryModel.class);


                        SharedPreferences.Editor editor = sPrefDictionary.edit();
                        editor.putString(word.getWord(), word.getDescription()).apply();
                        dictionaryAdapter.notifyDataSetChanged();

                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
        

        Map<String,?> keys = sPrefDictionary.getAll();
        for(Map.Entry<String,?> entry : keys.entrySet()){
            DictionaryModel dm = new DictionaryModel(entry.getKey(), entry.getValue().toString());
            arrayListDictionary.add(dm);
        }
        dictionaryAdapter = new DictionaryAdapter(Dictionary.this, arrayListDictionary);
        listViewDictionary.setAdapter(dictionaryAdapter);

    }
  • Вопрос задан
  • 122 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы