Таблица SQLite не создается: такой таблицы нет - PullRequest
0 голосов
/ 17 января 2019

У меня есть база данных, но одна из таблиц не создается.Есть одна таблица с именем 'campanha' и она отлично работает, но когда я пытаюсь создать другую (пользовательскую), даже без столбцов, говорит "нет такой таблицы: пользователь"

Уже попробуйте:

this.database= this.getWritableDatabase ();

Создание таблицы без столбцов, чтобы убедиться, что нет проблем с sql

Создание другого файла для создания другой таблицы - та же проблема

Код:

public class UserBDHelper extends SQLiteOpenHelper {

    private static  final int DB_VERSION = 1;
    private static final String DB_NAME = "tesp-psi-pl2-07-web";
    private static final String TABLE_NAME = "user";
    private static final String USERNAME = "username";
    private static final String EMAIL = "email";
    private static final String ACCESSTOKEN = "accesstoken";
    private static final String NOMEPROPRIO = "userNomeProprio";
    private static final String APELIDO = "userApelido";
    private static final String MORADA = "userMorada";
    private static final String DATANASC = "userDataNasc";
    private final SQLiteDatabase database;

    public UserBDHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        this.database = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createUsertable = "CREATE TABLE " + TABLE_NAME +
                "(id INTEGER, " +
                USERNAME    + " TEXT NOT NULL, " +
                EMAIL     + " TEXT NOT NULL, " +
                ACCESSTOKEN + " TEXT NOT NULL, " +
                NOMEPROPRIO    + " TEXT NOT NULL, " +
                APELIDO     + " TEXT NOT NULL, " +
                DATANASC     + " TEXT NOT NULL, " +
                MORADA       + " TEXT NOT NULL " +
                ")";

        db.execSQL(createUsertable);
    }

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

    public void removeAllUsers(){
        this.database.delete(TABLE_NAME,null,null);
    }

}

Ошибка в журнале: -

android.database.sqlite.SQLiteException: no such table: user (code 1): , while compiling: DELETE FROM user
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
    at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1496)
    at pt.ipleiria.estg.dei.amsi.fixbyte.modelo.UserBDHelper.removeAllUsers(UserBDHelper.java:109)

Ответы [ 3 ]

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

Вы не можете создать таблицу без столбцов.
Если вы пытались выполнить оператор типа

String createUsertable = "CREATE TABLE " + TABLE_NAME;
db.execSQL(createUsertable);

тогда вы получите сообщение об ошибке, и приложение упадет.
Таким образом, если ваше приложение не падает, это означает, что вышеприведенные операторы не выполняются, потому что oncreate() не вызывается.
Он не вызывается, потому что ваша база данных уже существует.
Таким образом, либо удалите приложение и повторно выполните с действительным оператором для таблицы
, либо измените версию базы данных на 2, чтобы вызвать onUpgrade().

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

Я полагаю, что ваша проблема в том, что у вас, вероятно, несколько помощников базы данных по одному на таблицу для одной / той же базы данных.

То есть тот, который вы показали, кажется, предназначен исключительно для пользовательской таблицы, и у вас, вероятно, есть другой для campanha таблицы.

Помощник по базам данных, как правило, подклассов класса SQLiteOpenHelper, который предназначен для открытия (подключения к) базы данных. Если файл базы данных не существует, он создаст базу данных, а затем откроет базу данных, как это делает, если файл базы данных существует (обратите внимание, что это не произойдет, пока не будет предпринята попытка доступа к базе данных).

Если файл базы данных не существует и он создает файл, то он вызовет метод onCreate . В этот раз он только вызывает onCreate (удаление файла, обычно путем очистки данных приложения или удаления приложения, приведет к запуску метода onCreate ).

Итак, что происходит, если у вас есть помощник по базе данных для каждой таблицы, так это то, что первый помощник по базам данных при попытке доступа к базе данных увидит, что файл базы данных не существует, создаст его и затем вызовет метод onCreate . Затем второй помощник базы данных видит, что файл базы данных существует и не вызывает его метод onCreate .

С точки зрения вашего кода (предполагается), Помощник по базам данных для таблицы campanha запускает onCreate и создает эту таблицу, но onCreate для таблицы user не запускается.

Исправление состоит в том, чтобы иметь одного помощника базы данных, который создает обе таблицы в методе onCreate , поэтому вам нужно объединить помощники базы данных.

Ваш код (отмечая, что таблица campanha, скорее всего, не будет соответствовать вашему дизайну) может выглядеть примерно так: -

public class UserBDHelper extends SQLiteOpenHelper {

    private static  final int DB_VERSION = 1;
    private static final String DB_NAME = "tesp-psi-pl2-07-web";
    private static final String TABLE_NAME = "user";
    private static final String USERNAME = "username";
    private static final String EMAIL = "email";
    private static final String ACCESSTOKEN = "accesstoken";
    private static final String NOMEPROPRIO = "userNomeProprio";
    private static final String APELIDO = "userApelido";
    private static final String MORADA = "userMorada";
    private static final String DATANASC = "userDataNasc";

    private static final String CAMPANHA_TABLE_NAME = "campanha"; //<<<<<<<<<< ADDED
    private static final String CAMPANHA_MYCOLUMN = "mycolumn"; //<<<<<<<<< ADDED

    private final SQLiteDatabase database;

    public UserBDHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        this.database = this.getWritableDatabase(); //<<<<<<<<<< Note this will access the database so the database will be created when the Database helper is instantiated
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createUsertable = "CREATE TABLE " + TABLE_NAME +
                "(id INTEGER, " +
                USERNAME    + " TEXT NOT NULL, " +
                EMAIL     + " TEXT NOT NULL, " +
                ACCESSTOKEN + " TEXT NOT NULL, " +
                NOMEPROPRIO    + " TEXT NOT NULL, " +
                APELIDO     + " TEXT NOT NULL, " +
                DATANASC     + " TEXT NOT NULL, " +
                MORADA       + " TEXT NOT NULL " +
                ")";

        db.execSQL(createUsertable);

        //<<<<<<<<<< ADDED this block of code
        String createCampanhaTable = "CREATE TABLE + CAMPANHA_TABLE_NAME +
                "(id INTEGER, " +
                CAMPANHA_MYCOLUMN + " TEXT NOT NULL " +
                ")";
        db.execSQL(createCampanhaTable); //<<<<<<<<< ADDED
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        db.execSQL("DROP TABLE IF EXISTS " + CAMPANHA_TABLE_NAME); //<<<<<<<<<< ADDED
        this.onCreate(db);
    }

    public void removeAllUsers(){
        this.database.delete(TABLE_NAME,null,null);
    }
}
  • ПРИМЕЧАНИЕ Выше приведен принципиальный код, весьма вероятно, что NOT будет действительным кодом, который вы хотите, и поэтому, скорее всего, его необходимо будет отрегулировать в соответствии с требованиями.
  • ПРИМЕЧАНИЕ: ВЫ ДОЛЖНЫ УДАЛИТЬ ДАННЫЕ ПРИЛОЖЕНИЯ ИЛИ УДАЛИТЬ ДОБАВИТЬ ДО ПРОВЕДЕНИЯ С ИЗМЕНЕННЫМ КОДОМ
  • ПРИМЕЧАНИЕ ВАМ НУЖНО ОБЕСПЕЧИТЬ ТО, ЧТО ИСПОЛЬЗУЕТСЯ ТОЛЬКО 1 ПОМОЩЬ БАЗЫ ДАННЫХ
0 голосов
/ 17 января 2019
  1. "CREATE TABLE " + TABLE_NAME - недопустимый оператор создания таблицы, поскольку в нем нет ни одного столбца. вам нужно добавить хотя бы один столбец, чтобы создать таблицу.

  2. "DROP TABLE IF EXISTS " + TABLE_NAME также кажется неудачным onUpgrade(), потому что таблица пользователей будет просто удалена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...