Как видно из журнала, после запуска Room я сверяюсь с журналом и получаю ложный ответ «isOpen», а еще в базе данных есть обратный вызов. Здесь, когда он открыт, написано открыто. Я не понимаю, связано ли это с задержкой или с запуском метода isOpen(). но после всего этого выдает ошибку в заголовке
Код: Выделить всё
DATABASECHECK isOpen: false // my log
Invalidation tracker is initialized twice :/.
DATABASECHECK Database open // my log
(1) no such table: room_table_modification_log in "SELECT * FROM room_table_modification_log WHERE invalidated = 1;"
Cannot run invalidation tracker. Is the db closed?
android.database.sqlite.SQLiteException: no such table: room_table_modification_log (code 1 SQLITE_ERROR[1]): , while compiling: SELECT * FROM room_table_modification_log WHERE invalidated = 1;
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1463)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:901)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:590)
at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:62)
at android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:2063)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:2038)
at androidx.sqlite.db.framework.FrameworkSQLiteDatabase.query(FrameworkSQLiteDatabase.kt:156)
at androidx.room.RoomDatabase.query(RoomDatabase.kt:484)
at androidx.room.RoomDatabase.query$default(RoomDatabase.kt:478)
at androidx.room.InvalidationTracker$refreshRunnable$1.checkUpdatedTable(InvalidationTracker.kt:408)
at androidx.room.InvalidationTracker$refreshRunnable$1.run(InvalidationTracker.kt:373)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
Код: Выделить всё
@Database(entities = {UserFood.class}, version = 1, exportSchema = false)
public abstract class UserFoodDatabase extends RoomDatabase {
public static volatile UserFoodDatabase userFoodDatabase;
public abstract UserFoodDao daoAccess();
public static UserFoodDatabase getDatabase(final Context context) {
if (userFoodDatabase == null) {
synchronized (UserFoodDatabase.class) {
if (userFoodDatabase == null) {
userFoodDatabase = Room.databaseBuilder(context.getApplicationContext(),
UserFoodDatabase.class, USER_FOODS_DB_NAME)
.addCallback(roomCallback)
.build();
}
}
}
return userFoodDatabase;
}
public static Callback roomCallback = new Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
Log.e("DATABASECHECK", "Database created");
db.execSQL("PRAGMA encoding = 'UTF-8';");
}
@Override
public void onOpen(@NonNull SupportSQLiteDatabase db) {
super.onOpen(db);
Log.e("DATABASECHECK ", "Database open");
db.execSQL("PRAGMA encoding = 'UTF-8';");
}
};
}
Код: Выделить всё
public class FoodListActivity extends AppCompatActivity {
UserFoodDatabase userFoodDatabase;
@SuppressLint("RestrictedApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_food_list);
userFoodDatabase = UserFoodDatabase.getDatabase(getApplicationContext());
Log.e("DATABASECHECK", "isOpen: " + userFoodDatabase.isOpen());
ExecutorService executor = Executors.newSingleThreadExecutor();
Handler handler = new Handler(Looper.getMainLooper());
executor.execute(() -> {
try {
userFoodDao = userFoodDatabase.daoAccess();
handler.post(new Runnable() {
@Override
public void run() {
loadData();
}
});
} finally {
executor.shutdown();
}
});
}
@Override
protected void onDestroy() {
Log.d("TAG_LIFE", "onDestroy");
userFoodDatabase.close();
super.onDestroy();
}
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... d-room-orm