В настоящее время я использую для хранения 5 определенных c кнопок информацию в базе данных (комнате), чтобы сохранять ее при перезагрузках. Мое текущее использование не зависит от изменений данных, потому что единственный, кто меняет данные, - это пользователь при долгом нажатии кнопки (затем я обновляю базу данных). Следовательно, мне не нужна переменная LiveData, и это затрудняет инициализацию моей модели ViewModel.
По сути, поскольку объекты LiveData обновляются только при изменении, мои данные никогда не инициализируются. Таким образом, приложение всегда будет вызывать нулевой указатель при запуске.
Я поделюсь с вами сутью своих настроек, которые были описаны ниже. Я надеюсь, что есть какой-то способ выполнить эту работу, при которой мне не нужно наблюдать за каким-либо объектом LiveData, и я могу просто получать данные при создании экземпляра модели.
Entity:
@Entity(tableName = "myEntity")
public class MyEntity {
@PrimaryKey
public int buttonID;
// other fields...
}
DAO:
@Dao
interface MyDAO {
@Query("Select * from myDB")
LiveData<List<MyEntity>> getEntityList();
// I think this needs to change to just List<MyEntity>?
// also insert and update here...
}
Репозиторий:
class MyRepository {
private MyDAO myDAO;
private LiveData<List<MyEntity>> allEntities;
MyRepository(Application application) {
MyDatabase db = MyDatabase.getInstance(application);
myDAO = db.myDAO();
allEntities = myDAO.getAllEntities();
}
LiveData<List<MyEntity>> getAllEntities() { return allEntities; }
// Update entity...
}
ViewModel:
public class ViewModel extends AndroidViewModel {
private MyRepository repository;
private List<MyEntity> tempList;
private HashMap<MyEntity> allEntities;
public ViewModel (Application application) {
super(application);
repository = new MyRepository(application);
Observer<List<MyEntity>> observer = data -> tempList = data;
ObserveOnce(repository.getAllEntities(), observer); // ObserveOnce implementation found in this answer: https://stackoverflow.com/a/59845763/10013384
allEntities = new HashMap<>();
for (int i = 0; i < tempList.size(); i++) { // Nullpointer here, as tempList doesn't have any items yet.
allEntities.put(tempList.get(i).buttonID, templist.get(i));
}
}
// getter and update methods...
}
Activity:
// ...
protected void onCreate(Bundle savedInstanceState) {
// ...
viewModel = new ViewModelProvider(this).get(ViewModel.class);
// Initialize UI views with data from ViewModel
}
Затем в соответствующие слушатели:
@Override
public boolean onLongClick(View v) {
int index = (Integer) v.getTag();
data.get(index).foo = fooNewUIData;
ButtonArray[index].setText(fooNewUIData);
ViewModel.update(data.get(index)); // if updated, update the ViewModel and the database
}