2013-06-09 2 views
3

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

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», и, похоже, все работает нормально. Я даже могу прочитать некоторые данные из таблицы «team» и отобразить значение в TextView. Но когда появляется таблица «игрока», все перестает работать. Я, вероятно, пропустил что-то очень очевидное, но я не могу найти его.

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

ответ

4

Объявите сначала все столбцы и положите 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)); 
+0

Спасибо так много. У меня было ощущение, что это что-то простое. Все отлично работает сейчас! Я принял этот ответ и попытался проголосовать, но мне нужна большая репутация. Еще раз спасибо!! – JMD123

+0

Это упоминание в документах? –

Смежные вопросы