Wie aktualisiere ich ein Feld in einer Raumdatenbank mit einem Repository und einem Ansichtsmodell?

COYG

Ich habe eine Raumdatenbank nach dieser Anleitung aus Code-Labs erstellt. Sie verwendet ein Repository, um:

Ein Repository verwaltet Abfrage-Threads und ermöglicht Ihnen die Verwendung mehrerer Back-Ends. Im gängigsten Beispiel implementiert das Repository die Logik für die Entscheidung, ob Daten aus einem Netzwerk abgerufen oder in einer lokalen Datenbank zwischengespeicherte Ergebnisse verwendet werden sollen.

Ich habe die Anleitung befolgt und bin jetzt in der Lage, die Entität zu erstellen und die Daten abzurufen. Ich bin sogar noch weiter gegangen und habe eine andere ganze Entität außerhalb des Rahmens des Leitfadens erstellt.

Ich kann jedoch nicht viele Ressourcen finden, die diesen MVVM(?)-Stil verwenden, also habe ich Mühe, das Repository wirklich zu verstehen. Im Moment möchte ich ein Feld aktualisieren. Nur eins, als ob ich es hinbekomme, dass der Rest ähnlich sein sollte.

Ich möchte ein Feld namens Dartshit aktualisieren und habe die dao-Methode dafür erstellt:

@Query("UPDATE AtcUserStats SET dartsHit = :amount WHERE userName = :userName") void UpdateHitAmount(int Betrag, String userName);

Ich habe ein Repository, von dem ich annahm, dass ich es für alle Entitäten verwende:

public class UsersRepository {

private UsersDao mUsersDao;
private AtcDao mAtcDao;
private LiveData<List<Users>> mAllUsers;
private LiveData<List<AtcUserStats>> mAllAtc;
private AtcUserStats mAtcUser;

UsersRepository(Application application) {
    AppDatabase db = AppDatabase.getDatabase(application);
    mUsersDao = db.usersDao();
    mAtcDao = db.atcDao();
    mAllUsers = mUsersDao.fetchAllUsers();
    mAllAtc = mAtcDao.getAllAtcStats();
}

LiveData<List<Users>> getAllUsers() {
    return mAllUsers;
}

LiveData<List<AtcUserStats>> getAllAtcStats() {
    return mAllAtc;
}

LiveData<AtcUserStats> getAtcUser(String username) {

    return mAtcDao.findByName(username);
}

public void insert (Users user) {
    new insertAsyncTask(mUsersDao).execute(user);
}

public void insertAtc (AtcUserStats atc) {
    new insertAsyncAtcTask(mAtcDao).execute(atc);
}

private static class insertAsyncTask extends AsyncTask<Users, Void, Void> {

    private UsersDao mAsyncTaskDao;

    insertAsyncTask(UsersDao dao) {
        mAsyncTaskDao = dao;
    }

    @Override
    protected Void doInBackground(final Users... params) {
        mAsyncTaskDao.insertNewUser(params[0]);
        return null;
    }
}

private static class insertAsyncAtcTask extends AsyncTask<AtcUserStats, Void, Void> {

    private AtcDao mAsyncTaskDao;

    insertAsyncAtcTask(AtcDao dao) {
        mAsyncTaskDao = dao;
    }

    @Override
    protected Void doInBackground(final AtcUserStats... params) {
        mAsyncTaskDao.insertNewAtcUser(params[0]);
        return null;
    }
}
}

Meine Frage ist, wie erstelle ich eine AsyncTask für die Update-Abfrage, die ich in diesem Repository ausführen möchte?

Folgendes habe ich bisher durch das weitgehende Kopieren der Insert-Repository-Methoden:

private class updateHitAsyncTask {

    private AtcDao mAsyncTaskDao;

    public updateHitAsyncTask(AtcDao mAtcDao) {

        mAsyncTaskDao = mAtcDao;
    }

    protected Void doInBackground(int amount, String name) {
        mAsyncTaskDao.UpdateHitAmount(amount, name);
        return null;
    }
}

Was falsch ist, ist, dass ich eine llegalStateException erhalte: Kann nicht auf die Datenbank im Hauptthread zugreifen, da die Benutzeroberfläche möglicherweise für längere Zeit gesperrt wird. Error. Aber ich dachte, diese AsyncTask soll sich darum kümmern?

Hier ist meine Update-Methode in meinem Ansichtsmodell, die 0 Fehler meldet:

  void updateHitAmount (int amount, String name) {
    mRepository.updateAtcHits(amount, name);
}

und hier ist der UI-Code, in dem ich tatsächlich versuche, all dies miteinander zu verknüpfen. Ich vermute, es muss einen besseren Weg geben als die Verwendung von onChanged zum einfachen Aktualisieren eines Felds, aber auch hier habe ich Schwierigkeiten, bei Google mit dem Repository-Ansatz auf Ratschläge zu stoßen:

   private void callOnChanged() {

    mAtcViewModel = ViewModelProviders.of(this).get(AtcViewModel.class);

    mAtcViewModel.getAllUsers().observe(this, new Observer<List<AtcUserStats>>() {
        @Override
        public void onChanged(@Nullable final List<AtcUserStats> atc) {
            // Update the cached copy of the users in the adapter.


            for (int i = 0; i < atc.size(); i++) {
                if (atc.get(i).getUserName().equals(mUser)) {
                    mAtcViewModel.updateHitAmount(55, mUser);
                    //atc.get(i).setDartsHit(55);
                    Log.d("id", String.valueOf(userSelected.getId()));
                }
            }
        }
    });

Wie kann ich Felder mit diesem Ansatz im Hintergrundthread aktualisieren?

COYG

Habe es aufgrund dieser Antwort hier herausgefunden . Es lag hauptsächlich an meinem mangelnden Verständnis von AsyncTask. Im Wesentlichen musste ich ein Objekt erstellen und die Daten auf diese Weise übergeben und dann im Hintergrund ausführen:

 private static class MyTaskParams {
    int amount;
    String name;

    MyTaskParams(int amount, String name) {
        this.amount = amount;
        this.name = name;
    }
}

public void updateAtcHits (int amount, String name) {

    MyTaskParams params = new MyTaskParams(amount,name);
    new updateHitAsyncTask(mAtcDao).execute(params);
}

private class updateHitAsyncTask extends AsyncTask<MyTaskParams,Void,Void>{

    private AtcDao mAsyncTaskDao;

    public updateHitAsyncTask(AtcDao mAtcDao) {

        mAsyncTaskDao = mAtcDao;
    }

    @Override
    protected Void doInBackground(MyTaskParams... myTaskParams) {
        int amount =myTaskParams[0].amount;
        String name = myTaskParams[0].name;
        mAsyncTaskDao.UpdateHitAmount(amount, name);
        return null;
    }
}

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Wie aktualisiere ich ein Feld mit einem Wert aus einer anderen Tabelle mit mehreren Joins?

Wie aktualisiere ich ein Feld in einem Unterdokumentarray mit einem Feld aus dem Dokument in MongoDB?

Wie aktualisiere ich ein bestimmtes Feld in einem Array, das einer Abfrage in einem Mongodb-Dokument entspricht?

Wie aktualisiere ich mit einem Join und einer Gruppe nach?

Wie funktioniert die Raumdatenbank mit LiveData, Repository und Ansichtsmodell zusammen?

Wie lese, aktualisiere und ersetze ich ein "String body" -Feld in einem Webtest über ein Plugin?

Wie aktualisiere ich ein Feld in einem csv :: ByteRecord?

Wie aktualisiere ich ein Feld mit vielen zu vielen Feldern aus einem Formular?

Wie kann ich ein String-Feld in einem Dataset mit einer Like-Klausel und einem Umlaut filtern?

Wie vergleiche ich ein Datum mit einem Array von Daten in einer SQL-Abfrage und aktualisiere einen Feldwert in MySQL?

Wie aktualisiere ich ein Feld mit einer Funktion in Django?

Springboot-JPA-Thymeleaf-Bootstrap. Wie aktualisiere ich den Inhalt einer gefilterten Tabelle, nachdem ich ein Feld mit einem modalen Formular aktualisiert habe?

Wie aktualisiere ich einen bestimmten Datenbankeintrag mit einem Ansichtsmodell als Controllermethodenattribut?

Wie rufe ich ein Ansichtsmodell von einem anderen Ansichtsmodell ab?

Wie erstelle ich ein berechnetes Feld mit einem anderen berechneten Feld in einer Mungo-Projektion?

Wie finde ich mit Lodash ein bestimmtes Element in einem Array und aktualisiere es dann mit setState ()?

Wie aktualisiere ich ein Feld in einer Struktur?

Wie aktualisiere ich ein Element in einer Redis-Liste mit einem Client vom Typ Servicestack?

Wie suche ich nach einem Teil einer Zeichenfolge in einem Feld und ersetze ihn, falls vorhanden, durch ein anderes Feld?

Wie finde und aktualisiere ich ein Element in einem Array in Mungo?

Wie aktualisiere ich ein Dokument in einem Objekt in einem Array in einem Objekt in einem Array mit MongoDB?

Wie aktualisiere ich ein Feld in einem Dokument, das auf einem anderen Dokument in Firestore basiert?

Wie aktualisiere ich ein Feld entsprechend einem anderen Feld in der Reaktion?

Wie aktualisiere ich ein Platzhalterbild mit einem asynchronen Bild?

Wie aktualisiere ich ein Nutzlastfeld mit einem regulären Ausdruck?

Wie verpacke ich ein Modell in ein Ansichtsmodell und verwende es in einem Datagrid?

Wie setze ich einen Wert für ein Feld einer Objektliste aus einer anderen Objektliste mit einem gemeinsamen Feld?

Wie setze ich ein Feld in einer Struktur mit einem leeren Wert?

Wie stelle ich einem Feld in einer CSV mit awk ein Zeichen voran?

TOP Liste

  1. 1

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  2. 2

    Eclipse Oxygen - Projekte verschwinden

  3. 3

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  4. 4

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  5. 5

    Wie kann ich den Kaskadenmodus global einstellen?

  6. 6

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  7. 7

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  8. 8

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  9. 9

    Modbus Python Schneider PM5300

  10. 10

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  11. 11

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  12. 12

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  13. 13

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  14. 14

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  15. 15

    Wie kann ich meine Tabelle abfragen, um sie in mySQL nach 2 Feldern zu gruppieren?

  16. 16

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

  17. 17

    ElasticSeach Auto Complete mit dem Vervollständigungsvorschlag, um das vollständige Dokument zurückzugeben

  18. 18

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  19. 19

    Wie wählt man Unterschiede mit drei Tabellen aus?

  20. 20

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  21. 21

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

heißlabel

Archiv