Мое приложение работает нормально при открытии. Он может предварительно заполнить базу данных из текстового файла в необработанной папке. Когда я открываю фрагмент, отображающий список упражнений, запрос выполняется нормально, и можно увидеть весь список. Если я нажму кнопку «Назад», чтобы полностью выйти из приложения, а затем снова войду, без проблем, список снова заполняется. Проблема в том, когда я нажимаю кнопку «последние» и нажимаю «закрыть все». Когда я снова вхожу в приложение, запрос для всех упражнений ничего не дает, и список пуст. Я искал высоко и низко и ничего не нашел. Мы надеемся, что прилагается достаточно кода для диагностики проблемы. Класс AppDatabase основан на приложении Google Architecture BasicSample.
@Database(entities = {BodySectionEntity.class, CardioEntity.class, ExerciseEntity.class, GoalEntity.class, SetRecordEntity.class, WorkoutEntity.class, WorkoutLibraryEntity.class}, version = 1, exportSchema = false)
@TypeConverters({Converter.class})
public abstract class AppDatabase extends RoomDatabase {
private static final String TAG = "AppDatabase";
private static AppDatabase sInstance;
@VisibleForTesting
public static final String DATABASE_NAME = "ig_db";
public abstract BodySectionDao bodySectionDao();
public abstract ExerciseDao exerciseDao();
public abstract WorkoutDao workoutDao();
public abstract SetRecordDao setRecordDao();
private final MutableLiveData<Boolean> mIsDatabaseCreated = new MutableLiveData<>();
public static AppDatabase getInstance(final Context context) {
Log.d(TAG, "getInstance()");
if (sInstance == null) {
synchronized (AppDatabase.class) {
if (sInstance == null) {
sInstance = buildDatabase(context.getApplicationContext());
sInstance.updateDatabaseCreated(context.getApplicationContext());
}
}
}
return sInstance;
}
private static AppDatabase buildDatabase(final Context appContext) {
Log.d(TAG, "build database");
return Room.databaseBuilder(appContext, AppDatabase.class, DATABASE_NAME)
.addCallback(new Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
Executors.newSingleThreadScheduledExecutor().execute(new Runnable() {
@Override
public void run() {
try {
AppDatabase database = AppDatabase.getInstance(appContext);
List<String> groups = Arrays.asList(appContext.getResources().getStringArray(R.array.groups));
populateDatabase(appContext, database, groups);
database.setDatabaseCreated();
} catch (IOException e) {
Log.d(TAG, e.toString());
}
}
});
}
@Override
public void onOpen(@NonNull SupportSQLiteDatabase db) {
super.onOpen(db);
}
}).build();
}
/**
* Check whether the database already exists and expose it via {@link #getDatabaseCreated()}
*/
private void updateDatabaseCreated(final Context context) {
Log.d(TAG, "updatedatabasecreated");
if (context.getDatabasePath(DATABASE_NAME).exists()) {
setDatabaseCreated();
}
}
private void setDatabaseCreated(){
Log.d(TAG, "setdatabasecreated");
mIsDatabaseCreated.postValue(true);
}
public LiveData<Boolean> getDatabaseCreated() {
Log.d(TAG, "getdatabasecreated");
return mIsDatabaseCreated;
}
private static void populateDatabase(final Context context, final AppDatabase db, final List<String> groups) throws IOException {
//insert the body parts
Log.d(TAG, "populateDatabase");
List<BodySectionEntity> list = new ArrayList<>();
for (String section : groups) {
list.add(new BodySectionEntity(section));
}
db.bodySectionDao().insertAll(list);
//insert the exercise data
InputStream inputStream = context.getResources().openRawResource(R.raw.exercise_data);
List<ExerciseEntity> exerciseEntities = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = reader.readLine()) != null) {
Log.i("IGv2", "inside while");
String[] strings = TextUtils.split(line, ",");
exerciseEntities.add(new ExerciseEntity(
strings[0].trim(),
findBodySectionKey(strings[1], groups),
strings[2].trim(),
strings[3].trim(),
strings[4].trim(),
strings[5].trim()));
}
Log.i("IGv2", "size: " + exerciseEntities.size());
db.exerciseDao().insertAll(exerciseEntities);
Log.i("IGv2", "exercises entered");
}
}
//grabs the correct id for the COL_BODY_SECTION_ID column and returns it
private static int findBodySectionKey(String part, final List<String> groups) {
Log.d("IGv2", "findboydsectionkey");
int index = groups.indexOf(part);
return ++index;
}
}
ExerciseDao
@Dao
public interface ExerciseDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(List<ExerciseEntity> exercises);
@Query("Select * From exercise Order By body_section_id, exercise ASC")
LiveData<List<ExerciseEntity>> getAllExercises();
}
WorkoutFragment
…
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mViewModel = ViewModelProviders.of(this).get(WorkoutViewModel.class);
mViewModel.getAllExercises().observe(this, new Observer<List<ExerciseEntity>>() {
@Override
public void onChanged(List<ExerciseEntity> exerciseEntities) {
if (exerciseEntities != null) {
Toast.makeText(getContext(), "Size: " + exerciseEntities.size(), Toast.LENGTH_SHORT).show();
mExerAdapter.setExerciseList(exerciseEntities);
}
}
});
mWorkoutAdapter.setWorkout(mViewModel.getWorkout());
}
Если нужно больше, пожалуйста, сообщите. Заранее спасибо