删除记录时,Android- Room(无法回滚-没有事务处于活动状态)

时间:2018-09-21 07:28:28

标签: android android-sqlite android-room android-livedata

我想每次删除整个表中的雇员。该表包含100万条记录(100mb)。当我执行以下代码时,我得到以下消息以及模拟器中的低磁盘存储空间。我增加了存储空间并再次运行它,但过一会儿会抛出相同的错误,并再次导致存储空间不足。似乎由于某种原因占用了所有设备存储空间。

  

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.SQLiteSession.endTransaction(SQLiteSession.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:450)在   java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)   在   java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:587)   在java.lang.Thread.run(Thread.java:841)

非常重要的笔记

  1. 如果记录减少到25k,则删除工作正常。
  2. 如果我使用实时数据和观察者删除代码,则删除可以处理100万条记录。
  3. 如果我放置一个不同的实时数据和观察者,以观察除Employee以外的其他表,则删除工作正常。
  4. 在API 27中运行良好。虽然删除需要一些时间。 APIS 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

  @Dao
  public interface EmployeeDao {

    @Query("DELETE FROM Employee")
    void deleteEmployees();

     @Transaction @Query("SELECT COUNT(*)  FROM Employee")
     LiveData<Integer> getNotifyEmployee();
  }       

0 个答案:

没有答案