Android: что не так с моим оператором создания таблицы? - PullRequest
0 голосов
/ 13 января 2019

Мой метод onCreate объекта SQLiteOpenHelper содержит следующий код:

Log.d("mytag", "oncreate is called");
db.execSQL("CREATE TABLE TrainingSession (id INTEGER PRIMARY KEY, session_date TEXT, session_status TEXT)");
Log.d("mytag", "tables were created");

Выход Logcat содержит только первый Log.d:

oncreate is called

А потом приложение вылетает. Что не так с моим оператором создания таблицы?

EDIT

Logcat фактически говорит, что таблица TrainingSession уже существует. Однако мой метод onUpgrade выглядит так:

Log.d("mytag", "onupgrade is called");
db.execSQL("DROP TABLE IF EXISTS TrainingSet; DROP TABLE IF EXISTS TrainingSession;");
onCreate(db);

и вывод Logcat этого метода, как и ожидалось, метод вызывается:

onupgrade is called

Если вызывается onUpgrade и таблицы удаляются, то почему onCreate говорит, что TrainingSession уже существует?

Ответы [ 2 ]

0 голосов
/ 13 января 2019

С https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase#execSQL(java.lang.String)

execSQL
добавлено на уровне API 1
public void execSQL (String sql)
Выполнить один оператор SQL, который НЕ является SELECT или любым другим оператором SQL который возвращает данные.
..............................
Параметры sql String:
SQL-оператор для выполнения.
Multiple операторы, разделенные точкой с запятой, не поддерживаются.

То есть execSql() не поддерживает несколько операторов, разделенных ;
Поэтому выполните несколько execSql() каждый для каждого оператора:

public static final String SQL_DELETE_TABLE1 = "DROP TABLE IF EXISTS TrainingSet"
db.execSQL(SQL_DELETE_TABLE1); 
public static final String SQL_DELETE_TABLE2 = "DROP TABLE IF EXISTS TrainingSession"
db.execSQL(SQL_DELETE_TABLE2);
0 голосов
/ 13 января 2019

Если запрос в порядке, эти вещи происходят довольно обидно, если структура базы данных изменилась.

Попробуйте:

Опция 1 : Добавить другую версию базы данных sqlite.

Опция 2 : Удалить базу данных и воссоздать ее.

Опция 3 : очистить данные приложения с экрана телефона Информация о приложении.

...