Комната не хранит данные в одной таблице - PullRequest
0 голосов
/ 14 ноября 2018

Мое приложение работает нормально при открытии. Он может предварительно заполнить базу данных из текстового файла в необработанной папке. Когда я открываю фрагмент, отображающий список упражнений, запрос выполняется нормально, и можно увидеть весь список. Если я нажму кнопку «Назад», чтобы полностью выйти из приложения, а затем снова войду, без проблем, список снова заполняется. Проблема в том, когда я нажимаю кнопку «последние» и нажимаю «закрыть все». Когда я снова вхожу в приложение, запрос для всех упражнений ничего не дает, и список пуст. Я искал высоко и низко и ничего не нашел. Мы надеемся, что прилагается достаточно кода для диагностики проблемы. Класс 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());
}

Если нужно больше, пожалуйста, сообщите. Заранее спасибо

1 Ответ

0 голосов
/ 24 ноября 2018

Я нашел исправление в создании базы данных приложений, где в самом низу до db.exerciseDao().insertAll(exerciseEntities); я попытался вставить более 500 записей.Когда я ставил для него заявление и делал каждый в отдельности, это работало без проблем.Я нашел в Интернете другие источники, в которых говорится, что использование транзакции SQLite лучше работает для такого большого количества вставок одновременно, а также что SQLite может обрабатывать только 500 вставок одновременно.В любом случае, оператор for решил проблему

...