Antworten:
Sie können dazu eine DAO-Methode erstellen.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
@Query
auf Dinge beschränkt war, die Ergebnismengen zurückgeben (ähnlich rawQuery()
). Sehr cool!
@Delete
kein Parameter verwendet wird und alle aus der Tabelle löschen? Ich versuche, Room's Tracker zu finden, um das einzureichen ...
Ids
? Das hat mir gefallen, aber die Tabellen-IDs werden weiter erhöht. In realen Tabellen werden Drop-IDs ebenfalls gelöscht, um wieder bei 0 zu beginnen.
Ab Room können 1.1.0
Sie clearAllTables () verwenden, die:
Löscht alle Zeilen aus allen Tabellen, die als Entitäten () in dieser Datenbank registriert sind.
SELECT name FROM sqlite_master WHERE type='table'
und dann manuell ausprobieren DELETE FROM {TABLE}
. Habe das aber nicht getestet.
Wenn Sie einen Eintrag aus der Tabelle in Room löschen möchten, rufen Sie einfach diese Funktion auf.
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
Update: Und wenn Sie die vollständige Tabelle löschen möchten, rufen Sie die folgende Funktion auf:
@Query("DELETE FROM MyModel")
void delete();
Hinweis: Hier ist MyModel ein Tabellenname.
Verwenden Sie clearAllTables () mit RXJava wie unten beschrieben, um dies zu vermeidenjava.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
Completable.fromAction(new Action() {
@Override
public void run() throws Exception {
getRoomDatabase().clearAllTables();
}
}).subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe(new Action() {
@Override
public void run() throws Exception {
Log.d(TAG, "--- clearAllTables(): run() ---");
getInteractor().setUserAsLoggedOut();
getMvpView().openLoginActivity();
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.d(TAG, "--- clearAllTables(): accept(Throwable throwable) ----");
Log.d(TAG, "throwable.getMessage(): "+throwable.getMessage());
}
});
Ich hatte Probleme beim Löschen aller Methoden, wenn ich RxJava zum Ausführen dieser Aufgabe im Hintergrund verwendete. So habe ich es endlich gelöst:
@Dao
interface UserDao {
@Query("DELETE FROM User")
fun deleteAll()
}
und
fun deleteAllUsers() {
return Maybe.fromAction(userDao::deleteAll)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
d("database rows cleared: $it")
}, {
e(it)
}).addTo(compositeDisposable)
}
thread {}
einpacken, anstatt mit RxJava
Wenn ich das kombiniere, was Dick Lucas sagt, und ein Reset automatisch inkrementell aus anderen StackOverFlow-Posts hinzufüge, denke ich, dass dies funktionieren kann:
fun clearAndResetAllTables(): Boolean {
val db = db ?: return false
// reset all auto-incrementalValues
val query = SimpleSQLiteQuery("DELETE FROM sqlite_sequence")
db.beginTransaction()
return try {
db.clearAllTables()
db.query(query)
db.setTransactionSuccessful()
true
} catch (e: Exception){
false
} finally {
db.endTransaction()
}
}
Um den Raum ohne Missbrauch der @Query
Anmerkung zu nutzen @Query
, wählen Sie zunächst alle Zeilen aus und fügen Sie sie in eine Liste ein. Beispiel:
@Query("SELECT * FROM your_class_table")
List`<`your_class`>` load_all_your_class();
Fügen Sie seine Liste in die Löschanmerkung ein, zum Beispiel:
@Delete
void deleteAllOfYourTable(List`<`your_class`>` your_class_list);
So habe ich es in Kotlin gemacht.
Injizieren Sie Raum db in die Aktivität mit DI (Koin).
private val appDB: AppDB by inject()
Dann können Sie einfach clearAllTables () aufrufen.
privater Spaß clearRoomDB () {GlobalScope.launch {appDB.clearAllTables () settings.put (PreferenceConstants.IS_UPLOADCATEGORIES_SAVED_TO_DB, false) settings.put (PreferenceConstants.IS_MEMBERHANDBOOK_SAVED_TO_DB, false)}}
clearAllTables()
"Löscht alle Zeilen aus allen Tabellen, die in dieser Datenbank als Entitäten registriert sind ()." Ich habe dies als Antwort unten angegeben, reproduziere es hier jedoch zur besseren Sichtbarkeit.