Sqlite исключение: столбец не найден - PullRequest
0 голосов
/ 29 ноября 2011

Я создал следующую базу данных:

   private static final String CREATE_TABLE_TEST=
        " create table " + TABLE_TEST +
        " (test_id integer primary key autoincrement," +
        COL_GRADE +" text not null," +
        DATE+" text not null);";



private static final String CREATE_TABLE_QUESTION=
        " create table " + TABLE_ANSWER +
        " (question_id integer primary key autoincrement," +
        COL_ANSWER_1+ " text not null,"+ 
        COL_ANSWER_2+" text not null," +
        COL_ANSWER_3+" text not null," +
        COL_ANSWER_4+" text not null," +
        COL_ANSWER_5+ " text not null,"+ 
        COL_ANSWER_6+" text not null," +
        COL_RIGHT_ANSWER+" integer," +
        COL_WRONG_ANSWER+" integer, " +
        COL_TEST_ID+" INTEGER, " + 
        "FOREIGN KEY(" + COL_TEST_ID + ") REFERENCES " + TABLE_TEST+"(test_id));";

Ошибка сохраняется до сих пор:

> 11-29 18:01:20.955: E/Database(853): Error inserting right_answer=6 wrong_answer=0 answer_5=fadsfas answer_6=gadsfdasasdfa

answer_3 = fasdfasf test_id = 1 answer_4 =fasdfsa answer_1 = fasdfasd answer_2 = fasdfas

11-29 18:01:20.955: E/Database(853): android.database.sqlite.SQLiteException: table answer has no column

с именем test_id : при компиляции: INSERT INTO answer (right_answer, неправильный_ответ, answer_5, answer_6, answer_3, test_id , answer_4, answer_1, answer_2) ЗНАЧЕНИЯ (?,?,?,?,?,?,?,?,?);

@Override
public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        Log.d("database", CREATE_TABLE_TEST); //I never see this statement in catlog
        Log.d("database", CREATE_TABLE_QUESTION); //nor this
        db.execSQL(CREATE_TABLE_QUESTION);
        db.execSQL(CREATE_TABLE_TEST);
    }

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS "+TABLE_TEST);
        db.execSQL("DROP TABLE IF EXISTS "+TABLE_ANSWER);
        onCreate(db);
    }

Я поместил это в текущее ..:

 dbClass=new database(this);        
    try
    {
        Log.w("inside ",  " database opened");///This gets printed
        dbLite=dbClass.getWritableDatabase();
        Log.w("after ",  " database opened");///This get printed
    }
    catch(Exception c)
    {
        Log.v("Open database exception caught", c.getMessage());
        dbLite=dbClass.getReadableDatabase();
    }

Ничего в onCreate не печатается ..

Как будто onCreate никогда не вызывается

Ответы [ 4 ]

1 голос
/ 29 ноября 2011

Ваш внешний ключ введен неправильно

http://www.sqlite.org/foreignkeys.html

для получения дополнительной информации

private static final String CREATE_TABLE_QUESTION=
" create table " + TABLE_ANSWER +
" (question_id integer primary key autoincrement," +
COL_ANSWER_1+ " text not null,"+ 
COL_ANSWER_2+" text not null," +
COL_ANSWER_3+" text not null," +
COL_ANSWER_4+" text not null," +
COL_ANSWER_5+ " text not null,"+ 
COL_ANSWER_6+" text not null," +
COL_RIGHT_ANSWER+" integer," +
COL_WRONG_ANSWER+" integer, " +
COL_TEST_ID+" INTEGER, " + 
"FOREIGN KEY(" + COL_TEST_ID + ") REFERENCES " + TABLE_TEST+"(test_id))";

должен сделать трюк

Кроме того, ваш метод onCreate выполняется только при создании базы данных, а не при обновлении вам следует переопределить onUpgrade для выполнения обновления (или тестирования на новом устройстве / эмуляторе)

http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onUpgrade(android.database.sqlite.SQLiteDatabase,%20int,%20int)

если вы расширяете sqliteOpenHelper, то вам нужно вызвать суперконструктора с вашим newVersionId для запуска onUpgrade

public YourDatabase(Context context) {
    super(context, DatabaseName, null, DATABASE_VERSION);
}

Совет: полностью удалите приложение из телефона / эмулятора и переустановите его (тогда БД будет удалена и она будет создана определенным образом, если проблема не в другом месте)

0 голосов
/ 29 ноября 2011

Первое, что бросается в глаза, это отсутствие пробелов после имени столбца и перед типом столбца в директиве создания таблицы ...

COL_GRADE + "текст не нулевой" + ДАТА + "текст не нулевой);";

Вы уверены, что таблица действительно была создана правильно?

0 голосов
/ 29 ноября 2011

Можете ли вы попробовать очистить данные приложения?Иногда база данных создается до того, как у вас есть все столбцы, и если ваш метод onUpgrade реализован неправильно, столбец никогда не будет добавлен, пока вы не очистите данные.

0 голосов
/ 29 ноября 2011

Слепое предположение: вам нужно ; после INTEGER REFERENCES test )?

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