5

मैं नीचे दिए गए कोड में पता लगाने की कोशिश कर रहा हूं, यह क्यों है कि कमरे के लाइवडाटा देखने योग्य मुझे नए डेटा के साथ डेटाबेस को पॉप्युलेट करने के बाद मुझे नई बदलाव नहीं देता है।कक्ष - डेटाबेस अपडेट होने पर लाइवडाटा पर्यवेक्षक ट्रिगर नहीं होता है

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; 
    } 
} 

क्यों मैं बदलाव की सूची मैं में जारी रहती है नहीं मिल रहा है() कॉलबैक सीधे देखें?

+0

क्या आप अपना व्यूमोडेल कोड दिखा सकते हैं और आप कहां/कैसे कॉल कर रहे हैं सभी()? – Lyla

+0

जो भी प्रदान किया गया अच्छा दिखता है, लेकिन ऊपर दिए गए पोस्ट के रूप में देखें ViewModel –

+0

@Lyla ViewModel कोड अनुरोध के अनुसार जोड़ा गया। – Tiago

उत्तर

20

मुझे डैगर 2 का उपयोग करने में एक ही समस्या थी जो दाओ के विभिन्न उदाहरणों के कारण हुई थी, डेटा अपडेट करने/डालने के लिए एक और एक अलग उदाहरण देखने के लिए लाइवडाटा प्रदान करता था। एक बार जब मैंने दाओगर को दाओ के सिंगलटन इंस्टेंस को प्रबंधित करने के लिए कॉन्फ़िगर किया, तो मैं अपनी गतिविधि में लाइवडेटा को देखते हुए पृष्ठभूमि में डेटा (मेरे मामले में) में डेटा डाल सकता था - और ऑन चेंज() कॉलबैक कहा जाएगा।

यह दाओ के उदाहरण के लिए नीचे आता है जो डेटा डालने/अद्यतन करने और अवलोकन के लिए लाइवडेटा प्रदान करने वाला एक ही उदाहरण होना चाहिए।

+0

हां, लाइव अपडेट प्राप्त करने के लिए आपको यह सुनिश्चित करना होगा कि 'दाओ' का उदाहरण सभी परिचालनों में समान होना चाहिए। –

+0

मैंने एक ही समस्या में खर्च किया और आपके anwser को धन्यवाद, मुझे पता चला कि मैं अपने 'रूमडेटाबेस' प्रावधान विधि पर 'सिंगलटन' भूल गया था। मैं यह जोड़ना चाहता हूं कि मेरे मामले में, मेरे पास 2 अलग-अलग 'दाओ की एक ही तालिका की पूछताछ है, जिसमें से एक क्लासिक इकाई से संबंधित है और एक एम्बेडेड इकाइयों के साथ एक रैपर क्लास में से एक है, जो एक जॉइन क्वेरी को पुन: पेश करता है। हालांकि ऑब्जेक्ट्स अलग हैं, लेकिन 'लाइवडाटा' सही तरीके से अपडेट हो जाता है, इसलिए हो सकता है कि यह 'रूमडेटाबेस' है जिसे सिंगलटन होना है। – devrocca

+0

केक का Emmm टुकड़ा। –

संबंधित मुद्दे