房间持久性库。删除所有
Room persistance library. Delete all
如何使用 Room Persistence Library 删除特定 table 上的所有条目?
我需要删除 table,但我找不到任何有关如何执行此操作的信息。
仅当数据库正在迁移或加载所有条目并删除它们时:)
您可以创建一个 DAO 方法来执行此操作。
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
如果想从 table 房间中删除一个条目,只需调用此函数,
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
更新: 如果你想删除完整的 table,请调用下面的函数,
@Query("DELETE FROM MyModel")
void delete();
注:这里MyModel是一个Table名字。
从房间 1.1.0
开始,您可以使用 clearAllTables() 其中:
Deletes all rows from all the tables that are registered to this database as entities().
结合 Dick Lucas 所说的内容并添加其他 Whosebug 帖子的重置自动增量,我认为这可行:
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()
}
}
像下面这样将 clearAllTables() 与 RXJava 一起使用以避免 java.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());
}
});
我在使用 RxJava 在后台执行此任务时遇到了删除所有方法的问题。这就是我最终解决它的方法:
@Dao
interface UserDao {
@Query("DELETE FROM User")
fun deleteAll()
}
和
fun deleteAllUsers() {
return Maybe.fromAction(userDao::deleteAll)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
d("database rows cleared: $it")
}, {
e(it)
}).addTo(compositeDisposable)
}
要在不滥用 @Query
注释的情况下使用房间,首先使用 @Query
到 select 所有行并将它们放入列表中,例如:
@Query("SELECT * FROM your_class_table")
List`<`your_class`>` load_all_your_class();
将他的列表放入删除注解中,例如:
@Delete
void deleteAllOfYourTable(List`<`your_class`>` your_class_list);
以下是我在 Kotlin 中的做法。
使用 DI (Koin) 在 activity 中注入房间数据库。
private val appDB: AppDB by inject()
然后你可以简单地调用 clearAllTables()
private fun clearRoomDB() {
GlobalScope.launch {
appDB.clearAllTables()
preferences.put(PreferenceConstants.IS_UPLOADCATEGORIES_SAVED_TO_DB, false)
preferences.put(PreferenceConstants.IS_MEMBERHANDBOOK_SAVED_TO_DB, false)
}
}
这就是我们如何从片段中做到这一点。
fun Fragment.emptyDatabase() {
viewLifecycleOwner.lifecycleScope.launchWhenCreated {
withContext(Dispatchers.IO) {
Database.getInstance(requireActivity()).clearAllTables()
}
}
}
如果您要从 activity 中清空数据库,请使用:
fun Activity.emptyDatabase() {
// create a scope to access the database from a thread other than the main thread
val scope = CoroutineScope(Dispatchers.Default)
scope.launch {
SitukaDatabase.getInstance(this@emptyDatabase).clearAllTables()
}
}
也可以从主线程调用 clearAllTables
方法。我还没有尝试过,但我注意到 Android Studio 无法将调用识别为挂起函数。
如果有人要删除所有表,请在应用程序中刷新所有内容,无需任何代码遵循
Device File Explorer -> data -> data -> com.YOUR_APP -> databases
您可以删除 databases
文件夹
中的文件
如果您正在使用 Rx
,您可以这样做。
@Query("DELETE FROM yourDB")
void delete(); : Completable
在您的数据库实例调用中
clearAllTables()
如何使用 Room Persistence Library 删除特定 table 上的所有条目? 我需要删除 table,但我找不到任何有关如何执行此操作的信息。
仅当数据库正在迁移或加载所有条目并删除它们时:)
您可以创建一个 DAO 方法来执行此操作。
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
如果想从 table 房间中删除一个条目,只需调用此函数,
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
更新: 如果你想删除完整的 table,请调用下面的函数,
@Query("DELETE FROM MyModel")
void delete();
注:这里MyModel是一个Table名字。
从房间 1.1.0
开始,您可以使用 clearAllTables() 其中:
Deletes all rows from all the tables that are registered to this database as entities().
结合 Dick Lucas 所说的内容并添加其他 Whosebug 帖子的重置自动增量,我认为这可行:
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()
}
}
像下面这样将 clearAllTables() 与 RXJava 一起使用以避免 java.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());
}
});
我在使用 RxJava 在后台执行此任务时遇到了删除所有方法的问题。这就是我最终解决它的方法:
@Dao
interface UserDao {
@Query("DELETE FROM User")
fun deleteAll()
}
和
fun deleteAllUsers() {
return Maybe.fromAction(userDao::deleteAll)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
d("database rows cleared: $it")
}, {
e(it)
}).addTo(compositeDisposable)
}
要在不滥用 @Query
注释的情况下使用房间,首先使用 @Query
到 select 所有行并将它们放入列表中,例如:
@Query("SELECT * FROM your_class_table")
List`<`your_class`>` load_all_your_class();
将他的列表放入删除注解中,例如:
@Delete
void deleteAllOfYourTable(List`<`your_class`>` your_class_list);
以下是我在 Kotlin 中的做法。
使用 DI (Koin) 在 activity 中注入房间数据库。
private val appDB: AppDB by inject()
然后你可以简单地调用 clearAllTables()
private fun clearRoomDB() {
GlobalScope.launch {
appDB.clearAllTables()
preferences.put(PreferenceConstants.IS_UPLOADCATEGORIES_SAVED_TO_DB, false)
preferences.put(PreferenceConstants.IS_MEMBERHANDBOOK_SAVED_TO_DB, false)
}
}
这就是我们如何从片段中做到这一点。
fun Fragment.emptyDatabase() {
viewLifecycleOwner.lifecycleScope.launchWhenCreated {
withContext(Dispatchers.IO) {
Database.getInstance(requireActivity()).clearAllTables()
}
}
}
如果您要从 activity 中清空数据库,请使用:
fun Activity.emptyDatabase() {
// create a scope to access the database from a thread other than the main thread
val scope = CoroutineScope(Dispatchers.Default)
scope.launch {
SitukaDatabase.getInstance(this@emptyDatabase).clearAllTables()
}
}
也可以从主线程调用 clearAllTables
方法。我还没有尝试过,但我注意到 Android Studio 无法将调用识别为挂起函数。
如果有人要删除所有表,请在应用程序中刷新所有内容,无需任何代码遵循
Device File Explorer -> data -> data -> com.YOUR_APP -> databases
您可以删除 databases
文件夹
如果您正在使用 Rx
,您可以这样做。
@Query("DELETE FROM yourDB")
void delete(); : Completable
在您的数据库实例调用中
clearAllTables()