मैं नीचे दिए गए कोड में पता लगाने की कोशिश कर रहा हूं, यह क्यों है कि कमरे के लाइवडाटा देखने योग्य मुझे नए डेटा के साथ डेटाबेस को पॉप्युलेट करने के बाद मुझे नई बदलाव नहीं देता है।कक्ष - डेटाबेस अपडेट होने पर लाइवडाटा पर्यवेक्षक ट्रिगर नहीं होता है
private void populateAdapter(@NonNull final List<Shift> shifts){
recyclerView.setAdapter(new SimpleItemRecyclerViewAdapter(shifts));
}
मैं भी निम्न कोड कि डेटाबेस भरता है (मैं RxJava का उपयोग करने के लिए:
shiftsViewModel = ViewModelProviders.of(this).get(ShiftsViewModel.class);
shiftsViewModel
.getShifts()
.observe(this, this::populateAdapter);
यह populateAdapter विधि है:
यह मेरा गतिविधि के onCreate पद्धति पर डाल दिया जाता है आईओ थ्रेड पर काम करें क्योंकि कमरे को मुख्य थ्रेड के बाहर अपने कोड की आवश्यकता होती है):
@Override
public Observable<List<Shift>> persistShifts(@NonNull final List<Shift> shifts){
return Observable.fromCallable(() -> {
appDatabase.getShiftDao().insertAll(shifts);
return shifts;
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
मेरी समस्या तब होती है जब मैं persistShifts को कॉल करता हूं जब मैं अपने बदलावों को देखना शुरू करता हूं। दृश्य मॉडल। मैं उम्मीद करता हूं कि मेरे पर्यवेक्षक (लाइवडाटा) सभी नए जोड़े गए बदलावों के साथ ट्रिगर किए जाएंगे। यह पता चला है कि पर्यवेक्षक ट्रिगर हो गया है, लेकिन बदले में बदलाव की एक खाली सूची लौटा दी गई है। इसे "काम" करने का एकमात्र तरीका यह है कि यदि मैं गतिविधि छोड़ देता हूं (इसलिए वर्तमान व्यूमोडेल को नष्ट कर रहा हूं) और फिर से दर्ज करें। इस बार व्यू मॉडेल की लाइवडाटा मुझे अपेक्षित सभी बदलावों को पहले जारी रखती है।
यहाँ कोड के बाकी है:
@Entity
public class Shift{
@PrimaryKey
private long id;
private String start;
private String end;
private String startLatitude;
private String startLongitude;
private String endLatitude;
private String endLongitude;
private String image;
...
डीएओ:
@Dao
public interface ShiftDAO {
@Query("SELECT * FROM shift")
LiveData<List<Shift>> getAll();
@Query("SELECT * FROM shift WHERE id = :id")
LiveData<Shift> getShiftById(long id);
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(List<Shift> shifts);
}
ViewModel:
public class ShiftsViewModel extends AndroidViewModel{
private final ISQLDatabase sqlDatabase;
private MutableLiveData<Shift> currentShift;
private LiveData<List<Shift>> shifts;
private boolean firstTimeCreated;
public ShiftsViewModel(final Application application){
super(application);
this.sqlDatabase = ((ThisApplication) application).getSQLDatabase();
this.firstTimeCreated = true;
}
public MutableLiveData<Shift> getCurrentlySelectedShift(){
if(currentShift == null){
currentShift = new MutableLiveData<>();
}
return currentShift;
}
public LiveData<List<Shift>> getShifts() {
if(shifts == null){
shifts = sqlDatabase.queryAllShifts();
}
return shifts;
}
public void setCurrentlySelectedShift(final Shift shift){
currentShift = getCurrentlySelectedShift();
currentShift.setValue(shift);
}
public boolean isFirstTimeCreated(){
return firstTimeCreated;
}
public void alreadyUsed(){
firstTimeCreated = false;
}
}
क्यों मैं बदलाव की सूची मैं में जारी रहती है नहीं मिल रहा है() कॉलबैक सीधे देखें?
क्या आप अपना व्यूमोडेल कोड दिखा सकते हैं और आप कहां/कैसे कॉल कर रहे हैं सभी()? – Lyla
जो भी प्रदान किया गया अच्छा दिखता है, लेकिन ऊपर दिए गए पोस्ट के रूप में देखें ViewModel –
@Lyla ViewModel कोड अनुरोध के अनुसार जोड़ा गया। – Tiago