2017-11-10 150 views
0

我已經搜索瞭解這個問題的性質,但迄今還沒有任何運氣。Android中的SQLite:外鍵和<表約束>預計

我正在做一個RPG風格的待辦事項列表來教自己的Android/Java和我正在做兩個表:類別(力量,智力等)和任務:名稱,描述,EXP等

我希望每個任務都有一個類別,但我得到一個表約束錯誤。我的代碼如下,並且GitHub鏈接是here

public void onCreate(SQLiteDatabase db){ 
    setForeignKeyConstraintsEnabled(db); 

db.execSQL("CREATE TABLE " + CATEGORY_TABLE_NAME + "(id INTEGER primary key autoincrement NOT NULL, name TEXT, exp INTEGER, level INTEGER)"); 
db.execSQL("CREATE TABLE " + QUEST_TABLE_NAME + "(id INTEGER primary key autoincrement NOT NULL, name TEXT, description TEXT, expValue INTEGER, category INTEGER NOT NULL, FOREIGN KEY (category) REFERENCES categories (id), date TEXT"); 

db.execSQL("INSERT INTO " + CATEGORY_TABLE_NAME + "('name', 'exp', 'level') VALUES ('Strength', 0, 0);"); 
db.execSQL("INSERT INTO " + CATEGORY_TABLE_NAME + "('name', 'exp', 'level') VALUES ('Stamina', 0, 0);"); 
db.execSQL("INSERT INTO " + CATEGORY_TABLE_NAME + "('name', 'exp', 'level') VALUES ('Intelligence', 0, 0);"); 
db.execSQL("INSERT INTO " + CATEGORY_TABLE_NAME + "('name', 'exp', 'level') VALUES ('Social', 0, 0);"); 
db.execSQL("INSERT INTO " + QUEST_TABLE_NAME + "('name', 'description', 'expValue', 'category', 'date') VALUES ('Gym', 'Weightlifting down The Gym', '300', '1', '25/05/2017');"); 
} 

誤差以 '日期的文字' 的到來,和錯誤說:

<table constraint> expected, got 'date'. 

這裏有什麼問題嗎?

+1

試着把它(日期文本)之前外鍵我不知道,但我認爲你需要把所有列前外鍵 – crammeur

+0

@crammeur如果我移動日期前FOREIGN KEY位,我得到以下錯誤: ')',DEFERRABLE,MATCH,NOT,ON或逗號預期,文件的意外結束 –

+1

因此更改日期到date1因爲日期是函數 – crammeur

回答

1

你的問題是,你混淆了column_constraint語法與table_constraint語法(即編碼其中前者應使用後者)。

您可以通過使用

db.execSQL("CREATE TABLE " + QUEST_TABLE_NAME + "(id INTEGER primary key autoincrement NOT NULL, name TEXT, description TEXT, expValue INTEGER, category INTEGER NOT NULL REFERENCES categories (id), date TEXT");

如下由於是替代語法,說明解決問題。

這是列約束語法與REFERENCES ....開始,是列定義的一部分(即列名是隱含的),而table_constraint語法與FORIEGN KEY(column_name) REFERENCES ...開始,遵循列定義

所以你可以有兩種: -

Column_constraint語法

  • 作爲列定義

  • category INTEGER NOT NULL REFERENCES categories (id)

例如的一部分

CREATE TABLE yourtablename (id INTEGER primary key autoincrement NOT NULL, name TEXT, description TEXT, expValue INTEGER, category INTEGER NOT NULL REFERENCES categories (id), date TEXT) 

Table_constraint語法

  • 列的後已被定義,但仍列定義即內仍然括號內。

  • FOREIGN KEY (category) REFERENCES categories (id)

即摹

CREATE TABLE yourtablename (id INTEGER primary key autoincrement NOT NULL, name TEXT, description TEXT, expValue INTEGER, category INTEGER NOT NULL, date TEXT, FOREIGN KEY (category) REFERENCES categories (id)); 

您可能會發現column-constraint和使用table-constraint


日期可以是列名。不過,我建議不要使用任何SQLite關鍵字(如date)作爲列名稱。