Почему я получаю ошибку, что таблицы с указанным именем нет в базе данных SQLite?

Пишу приложение. Оно должно сохранять задачи в базе данных. Для этого решил добавить небольшую базу данных SQLite с 1 таблицей внутри. Название таблицы - deffered_tasks. Скриншот таблицы

Я сохранил файл tasks.db и отправил его в папку к TaskDatabaseHelper. введите сюда описание изображения

Вот код TaskDatabaseHelper

public class TaskDatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "tasks.db";
    private static final int DATABASE_VERSION = 1;

    private static final String TABLE_TASKS = "deffered_tasks";
    private static final String COLUMN_ID = "id";
    private static final String COLUMN_NAME = "name";
    private static final String COLUMN_START_TIME = "start_time";
    private static final String COLUMN_END_TIME = "end_time";
    private static final String COLUMN_TEMPERATURE = "temperature";
    private static final String COLUMN_DAYS_OF_WEEK = "days_of_week";
    private SQLiteOpenHelper db;

    public TaskDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_TASKS_TABLE = "CREATE TABLE " + TABLE_TASKS + "("
                + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                + COLUMN_NAME + " TEXT,"
                + COLUMN_START_TIME + " INTEGER,"
                + COLUMN_END_TIME + " INTEGER,"
                + COLUMN_DAYS_OF_WEEK + " TEXT,"
                + COLUMN_TEMPERATURE + " REAL" + ")";
        db.execSQL(CREATE_TASKS_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_TASKS);
        onCreate(db);
    }

    public long addTask(Task task) {
        Log.d("DatabaseFloor", "IM HERE 2");
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_NAME, task.getName());
        values.put(COLUMN_START_TIME, task.getStartTime().getTimeInMillis());
        values.put(COLUMN_END_TIME, task.getEndTime().getTimeInMillis());
        values.put(COLUMN_DAYS_OF_WEEK, booleanArrayToString(task.getDaysOfWeek()));
        values.put(COLUMN_TEMPERATURE, task.getTemperature());
        Log.d("DatabaseFloor", "IM HERE 3");
        Log.d("DatabaseFloor", values.toString());
        long id =  db.insert(TABLE_TASKS, null, values);
        db.close();
        return id;
    }

    public List<Task> getAllTasks() {
        List<Task> taskList = new ArrayList<>();
        String selectQuery = "SELECT * FROM " + TABLE_TASKS;
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        if (cursor.moveToFirst()) {
            do {
                try {
                    int id = cursor.getInt(cursor.getColumnIndex(COLUMN_ID));
                    String name = cursor.getString(cursor.getColumnIndex(COLUMN_NAME));
                    long startTimeMillis = cursor.getLong(cursor.getColumnIndex(COLUMN_START_TIME));
                    long endTimeMillis = cursor.getLong(cursor.getColumnIndex(COLUMN_END_TIME));
                    String daysOfWeekString = cursor.getString(cursor.getColumnIndex(COLUMN_DAYS_OF_WEEK));
                    double temperature = cursor.getDouble(cursor.getColumnIndex(COLUMN_TEMPERATURE));

                    Calendar startCalendar = Calendar.getInstance();
                    startCalendar.setTimeInMillis(startTimeMillis);
                    Calendar endCalendar = Calendar.getInstance();
                    endCalendar.setTimeInMillis(endTimeMillis);
                    boolean[] daysOfWeek = stringToBooleanArray(daysOfWeekString);

                    Task task = new Task(id, name, startCalendar, endCalendar, daysOfWeek, temperature);
                    taskList.add(task);
                }
                catch (Exception ex) {
                    Log.d("error", ex.toString());
                }
            } while (cursor.moveToNext());
        }
        cursor.close();
        db.close();
        return taskList;
    }

    private String booleanArrayToString(boolean[] array) {
        StringBuilder sb = new StringBuilder();
        for (boolean b : array) {
            sb.append(b ? "1" : "0");
        }
        return sb.toString();
    }

    private boolean[] stringToBooleanArray(String str) {
        boolean[] array = new boolean[str.length()];
        for (int i = 0; i < str.length(); i++) {
            array[i] = str.charAt(i) == '1';
        }
        return array;
    }

    public void deleteTask(int taskId) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_TASKS, COLUMN_ID + " = ?", new String[]{String.valueOf(taskId)});
        db.close();
    }
}

При попытке записать задачу в базу данных я получаю такую ошибку:

Error inserting start_time=39480000 days_of_week=0010001 name=нррооо temperature=25.5 end_time=57480000
                                                                                                   android.database.sqlite.SQLiteException: no such table: deffered_tasks (code 1 SQLITE_ERROR[1]): , while compiling: INSERT INTO deffered_tasks(start_time,days_of_week,name,temperature,end_time) VALUES (?,?,?,?,?)
                                                                                                        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                                                                        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1478)
                                                                                                        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:916)
                                                                                                        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:590)

При попытке зайти на активность, где нужно получать все Tasks из таблицы, я получаю такую ошибку:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ztenergywarmfloor/com.example.ztenergywarmfloor.Pages.DeferredTasksActivity}: android.database.sqlite.SQLiteException: no such table: deffered_tasks (code 1 SQLITE_ERROR[1]): , while compiling: SELECT * FROM deffered_tasks

Вот код класса Task:

public class Task {
    private int id;
    private String name;
    private Calendar startTime;
    private Calendar endTime;
    private boolean[] daysOfWeek;
    private double temperature;

    public Task(int id, String name, Calendar startTime, Calendar endTime, boolean[] daysOfWeek, double temperature) {
        this.id = id;
        this.name = name;
        this.startTime = startTime;
        this.endTime = endTime;
        this.daysOfWeek = daysOfWeek;
        this.temperature = temperature;
    }

    public String getName() {
        return name;
    }

    public Calendar getStartTime() {
        return startTime;
    }

    public boolean[] getDaysOfWeek() {
        return daysOfWeek;
    }

    public double getTemperature() {
        return temperature;
    }

    public Calendar getEndTime() {
        return endTime;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

Вот код, во время исполнения которого происходит сама ошибка

public void createTask(View v) {
        selectedDays[0] = checkboxMonday.isChecked();
        selectedDays[1] = checkboxTuesday.isChecked();
        selectedDays[2] = checkboxWednesday.isChecked();
        selectedDays[3] = checkboxThursday.isChecked();
        selectedDays[4] = checkboxFriday.isChecked();
        selectedDays[5] = checkboxSaturday.isChecked();
        selectedDays[6] = checkboxSunday.isChecked();

        String taskNameText = taskName.getText().toString().trim();

        if (taskNameText.isEmpty()) {
            Toast.makeText(this, "Пожалуйста, введите имя задачи.", Toast.LENGTH_SHORT).show();
            return;
        }

        String startTimeText = startDateTimeView.getText().toString();
        String stopTimeText = stopDateTimeView.getText().toString();

        SimpleDateFormat dateFormatWithDate = new SimpleDateFormat("dd-MM-yyyy HH:mm", Locale.getDefault());
        SimpleDateFormat dateFormatWithTime = new SimpleDateFormat("HH:mm", Locale.getDefault());

        Calendar startCalendar = Calendar.getInstance();
        Calendar stopCalendar = Calendar.getInstance();

        try {
            if (repeatable) {
                startCalendar.set(Calendar.YEAR, dateAndTime.get(Calendar.YEAR));
                startCalendar.set(Calendar.MONTH, dateAndTime.get(Calendar.MONTH));
                startCalendar.set(Calendar.DAY_OF_MONTH, dateAndTime.get(Calendar.DAY_OF_MONTH));
                startCalendar.setTime(dateFormatWithTime.parse(startTimeText));

                stopCalendar.set(Calendar.YEAR, dateAndTime.get(Calendar.YEAR));
                stopCalendar.set(Calendar.MONTH, dateAndTime.get(Calendar.MONTH));
                stopCalendar.set(Calendar.DAY_OF_MONTH, dateAndTime.get(Calendar.DAY_OF_MONTH));
                stopCalendar.setTime(dateFormatWithTime.parse(stopTimeText));
            } else {
                startCalendar.setTime(dateFormatWithDate.parse(startTimeText));
                stopCalendar.setTime(dateFormatWithDate.parse(stopTimeText));
            }
        } catch (ParseException e) {
            Toast.makeText(this, "Ошибка преобразования времени. Убедитесь, что формат корректный.", Toast.LENGTH_SHORT).show();
            return;
        }

        long startTime = startCalendar.getTimeInMillis();
        long stopTime = stopCalendar.getTimeInMillis();

        if (startTime >= stopTime) {
            Toast.makeText(this, "Время начала должно быть меньше времени конца.", Toast.LENGTH_SHORT).show();
            return;
        }

        double temperature = 25.5;

        Task task = new Task(0, taskNameText, startCalendar, stopCalendar, selectedDays, temperature);
        long taskId = dbHelper.addTask(task);
        Log.d("DatabaseFloor", "IM HERE");
        if (taskId != -1) {
            scheduleTask((Calendar) dateAndTime.clone(), selectedDays, temperature, (int) taskId);

            Toast.makeText(this, "Задача добавлена", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "Ошибка сохранения задачи", Toast.LENGTH_SHORT).show();
        }
    }

Ответы (1 шт):

Автор решения: woesss

Вы не правильно понимаете работу фреймворка SQLite в Андроиде.
Он никак не использует ваш заготовленный файл, а при первом обращении к базе создаёт её (пустую) в приватной папке приложения на устройстве.
Создание таблиц и заполнение их данными должно производиться программно в методах хелпера.
Напоминаю - база создаётся при первом обращении! Если вы вписали код в метод onCreate(SQLiteDatabase) после того как уже запускали приложение, то этот код не выполнится. Чтобы внести изменения в базу нужно повысить её версию и выполнить обновление в onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion).
В случае когда приложение в разработке и ещё не опубликовано - вы можете не повышать версию, а просто удалить данные приложения или через файл-менеджер в студии найти и удалить сам файл БД, тогда она будет заново создана при следующем запуске.

→ Ссылка