it-swarm.com.de

Konvertieren Sie LiveData in MutableLiveData

Anscheinend kann Room MutableLiveData nicht verarbeiten, und wir müssen bei LiveData bleiben, da es den folgenden Fehler zurückgibt:

error: Not sure how to convert a Cursor to this method's return type

Ich habe ein "benutzerdefiniertes" MutableLiveData in meinem DB-Helfer folgendermaßen erstellt:

class ProfileRepository @Inject internal constructor(private val profileDao: ProfileDao): ProfileRepo{

    override fun insertProfile(profile: Profile){
        profileDao.insertProfile(profile)
    }

    val mutableLiveData by lazy { MutableProfileLiveData() }
    override fun loadMutableProfileLiveData(): MutableLiveData<Profile> = mutableLiveData

    inner class MutableProfileLiveData: MutableLiveData<Profile>(){

        override fun postValue(value: Profile?) {
            value?.let { insertProfile(it) }
            super.postValue(value)
        }

        override fun setValue(value: Profile?) {
            value?.let { insertProfile(it) }
            super.setValue(value)
        }

        override fun getValue(): Profile? {
            return profileDao.loadProfileLiveData().getValue()
        }
    }
}

Auf diese Weise erhalte ich die Aktualisierungen von der DB und kann das Profile-Objekt speichern, aber ich kann keine Attribute ändern.

Zum Beispiel: mutableLiveData.value = Profile() würde funktionieren .mutableLiveData.value.userName = "name" würde getValue() statt postValue() aufrufen und würde nicht funktionieren.

Hat jemand eine Lösung dafür gefunden?

6
kike

Nennen Sie mich verrückt, aber AFAIK gibt es keinen Grund, ein MutableLiveData für das Objekt zu verwenden, das Sie vom DAO erhalten haben.

Die Idee ist, dass Sie ein Objekt über LiveData<List<T>> verfügbar machen können. 

@Dao
public interface ProfileDao {
    @Query("SELECT * FROM PROFILE")
    LiveData<List<Profile>> getProfiles();
}

Jetzt kannst du sie beobachten:

profilesLiveData.observe(this, (profiles) -> {
    if(profiles == null) return;

    // you now have access to profiles, can even save them to the side and stuff
    this.profiles = profiles;
});

Wenn Sie also festlegen möchten, dass diese Live-Daten "neue Daten ausgeben und ändern", müssen Sie das Profil in die Datenbank einfügen. Das Schreiben wertet diese Abfrage erneut aus und wird ausgegeben, sobald der neue Profilwert in db geschrieben wird.

dao.insert(profile); // this will make LiveData emit again

Es gibt also keinen Grund, getValue/setValue zu verwenden. Schreiben Sie einfach in Ihre Datenbank.

6
EpicPandaForce

Da Room MutableLiveData nicht unterstützt und nur LiveData unterstützt, ist der Ansatz, einen Wrapper zu erstellen, der beste Ansatz, den ich mir vorstellen kann. Für Google ist es kompliziert, MutableLiveData zu unterstützen, da die setValue- und postValue-Methoden public sind. Wo LiveData, sind sie protected, was mehr Kontrolle gibt.

0
Sagar