Ошибка синтаксиса внешнего ключа Android SQLite

Я только начинаю играть с базами данных SQLite в приложениях для Android. Я пытаюсь создать таблицу 'team' и таблицу 'player', и я хочу, чтобы таблица 'player' имела внешний ключ, который ссылается на поле _ID автоинкремента таблицы 'team (я думаю, что это поле _ID происходит от реализации BaseColumns в моем классе контракта). Я думал, что у меня был правильный синтаксис, но я получаю следующую ошибку (даже после удаления и переустановки моего приложения)

06-08 20:26:22.763: E/Database(29843): Failure 1 (near "playerName": syntax error) on 0x22a110 when preparing 'CREATE TABLE player (_id INTEGER PRIMARY KEY,team_ID INTEGER, FOREIGN KEY(team_ID) REFERENCES team(_id), playerName TEXT,playerAge INTEGER,playerPosition TEXT,playerHeight REAL,playerWeight REAL,playerPhoto TEXT,playerNumber INTEGER)'.

Приведенная выше ошибка показывает оператор SQL, который в итоге пытается пройти. Это код для создания оператора SQL (извините, он излишне многословен, я следовал учебному пособию):

private static final String SQL_CREATE_ENTRIES = "CREATE TABLE "
        + TeamTable.TABLE_NAME + " (" + TeamTable._ID
        + " INTEGER PRIMARY KEY," + TeamTable.COLUMN_NAME_TEAM_NAME
        + TEXT_TYPE + COMMA_SEP + TeamTable.COLUMN_NAME_TEAM_WINS
        + TEXT_TYPE + COMMA_SEP + TeamTable.COLUMN_NAME_TEAM_LOSSES
        + TEXT_TYPE + COMMA_SEP + TeamTable.COLUMN_NAME_TEAM_LOGO
        + TEXT_TYPE + " )";

private static final String SQL_CREATE_ENTRIES_2 = "CREATE TABLE "
        + PlayerTable.TABLE_NAME + " (" + PlayerTable._ID
        + " INTEGER PRIMARY KEY," + "team_ID INTEGER, "
        + "FOREIGN KEY(team_ID) REFERENCES team(_id), "
        + PlayerTable.COLUMN_NAME_PLAYER_NAME + TEXT_TYPE + COMMA_SEP
        + PlayerTable.COLUMN_NAME_PLAYER_AGE + " INTEGER" + COMMA_SEP
        + PlayerTable.COLUMN_NAME_PLAYER_POSITION + TEXT_TYPE + COMMA_SEP
        + PlayerTable.COLUMN_NAME_PLAYER_HEIGHT + " REAL" + COMMA_SEP
        + PlayerTable.COLUMN_NAME_PLAYER_WEIGHT + " REAL" + COMMA_SEP
        + PlayerTable.COLUMN_NAME_PLAYER_PHOTO + TEXT_TYPE + COMMA_SEP
        + PlayerTable.COLUMN_NAME_PLAYER_NUMBER + " INTEGER" + ")";

Тогда я использую execSQL(SQL_CREATE_ENTRIES) а также execSQL(SQL_CREATE_ENTRIES_2и появляется ошибка. Я попытался создать только "командную" таблицу, и, кажется, она работает хорошо. Я даже могу прочитать некоторые данные из таблицы 'team' и отобразить значение в TextView. Но когда появляется таблица "игрок", вещи перестают работать. Я, вероятно, упускаю что-то очень очевидное, но я не могу найти это.

Любая помощь очень ценится!

1 ответ

Решение

Объявите сначала все столбцы и поставьте FOREIGN KEY(team_ID) REFERENCES team(_id) после последнего столбца.

Итоговый запрос

CREATE TABLE player
(_id INTEGER PRIMARY KEY,
team_ID INTEGER, 
playerName TEXT,
playerAge INTEGER,
playerPosition TEXT,
playerHeight REAL,
playerWeight REAL,
playerPhoto TEXT,
playerNumber INTEGER,
FOREIGN KEY(team_ID) REFERENCES team(_id));
Другие вопросы по тегам