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