Я хочу каждый раз удалять всю таблицу сотрудников.Таблица состоит из 1 миллиона записей (100 МБ).Когда я выполняю код ниже, я получаю сообщение ниже и недостаточно места на диске в эмуляторе.Я увеличил хранилище и запустил его снова, но через некоторое время выдает ту же ошибку и снова не хватает памяти.Кажется, что по какой-то причине он занимает все хранилище устройства.
android.database.sqlite.SQLiteException: невозможно выполнить откат - никакая транзакция не активна (код 1) в android.database.sqlite.SQLiteConnection.nativeExecute (собственный метод) в android.database.sqlite.SQLiteConnection.execute (SQLiteConnection.java:555) в android.database.sqlite.SQLiteSession.endTransactionUnchecked (SQLiteSession.java:439) в android.database.sqlite.SQLiteransessioneSQLiteSession.java:401) в android.database.sqlite.SQLiteDatabase.endTransaction (SQLiteDatabase.java:522) в android.arch.persistence.db.framework.FrameworkSQLiteDatabase.endTransaction (FrameworkSQLiteDatabase.java:90) в android.arch.persistence.room.RoomDatabase.endTransaction (RoomDatabase.java:261) в com.ehr.Database.Daos.EmployeeDao_Impl.deleteEmployees (EmployeeDao_Impl.java:175) в com.ehr.DataRepository $ 7.run (DataRepository.java:4).util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112)в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:587) в java.lang.Thread.run (Thread.java:841)
Очень важные примечания
- Если количество записей уменьшилось до 25 КБ, удаление работает нормально.
- Если я удаляю код с данными в реальном времени и с наблюдателем, удаление отлично работает с 1 миллионом записей.
- Если я добавлю другие действующие данные и наблюдателя, которые будут наблюдать за другой таблицей, отличной от Employee, удаление будет работать нормально.
- В API 27 работает хорошо.Хотя для удаления требуется некоторое время.АПИС 19,21,23 не работает.
Есть идеи?Это ошибка?
Код
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((BasicApp) getApplication()).getRepository().getNotifyEmployee().observe(this,new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer number) {
//staff
}
});
executors.diskIO().execute(new Runnable() {
@Override
public void run() {
mDatabase.repoEmployee().deleteEmployees();
});
}
}
Дао
@Dao
public interface EmployeeDao {
@Query("DELETE FROM Employee")
void deleteEmployees();
@Transaction @Query("SELECT COUNT(*) FROM Employee")
LiveData<Integer> getNotifyEmployee();
}