我使用Room库使用以下代码来处理sqldatabase。我曾多次使用downloadCustomers方法,但突然间我在mDatabase.repoCustomer()。deleteCustomers()中收到以下消息:
消息:
数据库的连接池无法授予与线程室android的连接
这只发生过一次,我擦除了模拟器,因此可以再次运行它。 我在论坛上读到“ 交易可能被线程打开”,但是Room库会自动处理此类情况。
有什么想法吗?
仿真器:带有Google Play的仿真器API 27(不是Google API)
要考虑的事情:有时,当我在Google上运行应用时,会发生奇怪的事情,例如e.x同时运行带有2个实例的应用。但是我不想做个简单的假设。
谢谢。
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase sInstance;
@VisibleForTesting
public static final String DATABASE_NAME = "Database_db";
public abstract CustomerDao repoCustomer();
public static AppDatabase getInstance(Context context) {
if (sInstance == null) {
synchronized (AppDatabase.class) {
if (sInstance == null) {
sInstance = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME).build();
}
}
}
return sInstance;
}
public void downloadCustomers(final String table){
executors.diskIO().execute(new Runnable() {
@Override
public void run() {
mDatabase.repoCustomer().deleteCustomers();
if (mDatabase.repoCustomer().getAllCustomers().size() == 0) {
makeHttpRequest();
}
});
}
}
@Dao
public interface CustomerDao {
@Transaction @Query("SELECT * FROM Customer")
LiveData<List<Customer>> getAllCustomersLive();
@Transaction @Query("SELECT * FROM Customer")
List<Customer> getAllCustomers();
@Transaction @Insert(onConflict = OnConflictStrategy.REPLACE)
void insertCustomers(List<Customer> Customers);
@Query("DELETE FROM Customer")
int deleteCustomers();
}