So füge ich Daten mithilfe der Room Persistence Library in die Datenbank ein:
Entität:
@Entity
class User {
@PrimaryKey(autoGenerate = true)
public int id;
//...
}
Datenzugriffsobjekt:
@Dao
public interface UserDao{
@Insert(onConflict = IGNORE)
void insertUser(User user);
//...
}
Ist es möglich, die ID des Benutzers zurückzugeben, sobald das Einfügen in der obigen Methode abgeschlossen ist, ohne eine separate Auswahlabfrage zu schreiben?
android
persistent-storage
android-room
DeveScie
quelle
quelle
int
oderlong
stattvoid
als Ergebnis der@Insert
Operation zu verwenden?aSyncTask
? Wie geben Sie den Wert aus Ihrer Repository-Funktion zurück?Antworten:
Basierend auf der Dokumentation hier (unter dem Code-Snippet)
Eine mit der
@Insert
Annotation versehene Methode kann Folgendes zurückgeben:quelle
@Insert
Funktion kann zurückkehrenvoid
,long
,long[]
oderList<Long>
. Bitte versuchen Sie dies.quelle
return Single.fromCallable(() -> dbService.YourDao().insert(mObject));
Der Rückgabewert der Einfügung für einen Datensatz ist 1, wenn Ihre Anweisung erfolgreich ist.
Wenn Sie eine Liste von Objekten einfügen möchten, können Sie Folgendes ausführen:
Und führen Sie es mit Rx2 aus:
quelle
Holen Sie sich die Zeilen-ID mit dem folgenden Sniplet. Es verwendet callable auf einem ExecutorService mit Future.
Ref: Java Executor Service - Tutorial für weitere Informationen über aufrufbare.
quelle
In Ihrem Dao gibt
Long
die Einfügeabfrage dh die eingefügte Zeilen-ID zurück.In Ihrer Model (Repository) -Klasse: (MVVM)
In Ihrer ModelView-Klasse: (MVVM) Behandeln Sie LiveData mit DisposableSingleObserver.
Working Sourcer Referenz: https://github.com/SupriyaNaveen/CookingRecipes
quelle
Nach vielen Kämpfen gelang es mir, dies zu lösen. Hier ist meine Lösung mit MMVM-Architektur:
Student.kt
StudentDao.kt
StudentRepository.kt
StudentViewModel.kt
Im Fragment:
Ich habe DataBinding verwendet. Hier ist mein XML:
Ich habe viel Mühe gehabt, dies mit asynctask zu erreichen, da der Vorgang zum Einfügen und Löschen von Räumen in einem separaten Thread ausgeführt werden muss. Endlich in der Lage, dies mit Single zu tun in RxJava Art beobachtet werden .
Hier sind Gradle-Abhängigkeiten für rxjava:
quelle
Gemäß der mit @Insert annotierten Dokumentation können Funktionen die rowId zurückgeben.
Das Problem dabei ist, dass es die rowId und nicht die ID zurückgibt und ich immer noch nicht herausgefunden habe, wie ich die ID mithilfe der rowId erhalten kann.
Leider kann ich noch keinen Kommentar abgeben, da ich keinen Ruf von 50 habe. Deshalb poste ich dies stattdessen als Antwort.
quelle