Добрый день,
Имеется проект, который привязан к 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);
}