2013-04-18 93 views
0

由于FOREIGN KEY语法错误,我的表没有被创建,但我似乎无法弄清楚。我确定在调用FK之前先创建int。下面是与FK未创建外键语法错误表

public class PlayerStatsDatabase { 
public static final String KEY_ROWID = "_id"; 
public static final String PLAYER_ID = "PlayerId"; 
public static final String KEY_SCORE = "Goals_Scored"; 
public static final String KEY_MINUTES = "Minutes_Played"; 
public static final String KEY_SUBIN = "Substitute_In"; 
public static final String KEY_SUBOUT = "Substitute_Out"; 
public static final String KEY_BOOKING = "Booked"; 

private static final String TAG = "PlayersStatsDatabase"; 
private DatabaseHelper mDbHelper; 
private SQLiteDatabase mDb; 

private static final String DATABASE_NAME = "Players"; 
private static final String SQLITE_TABLE = "PlayerStats"; 
private static final int DATABASE_VERSION = 2; 

private final Context mCtx; 

private static final String DATABASE_CREATE = 
    "CREATE TABLE if not exists " + SQLITE_TABLE + " (" + 
    KEY_ROWID + " integer PRIMARY KEY autoincrement," + 
    PLAYER_ID + "integer"+" FOREIGN KEY ("+PLAYER_ID+") REFERENCES "+DATABASE_NAME+" ("+KEY_ROWID+"),"+ 
    KEY_SCORE + "," + 
    KEY_MINUTES + "," + 
    KEY_SUBIN + "," + 
    KEY_SUBOUT + "," + 
    KEY_BOOKING + ")" ; 

主键为我的班德代码在这个类

public class PlayerDbAdapter { 

private static final String DATABASE_TABLE = "Players"; 
private static final String DATABASE_CREATE = "CREATE TABLE "+DATABASE_TABLE+" (_id integer primary key autoincrement, Player_Name text not null, Player_Position text not null, Player_Number text not null, Team text not null);"; 
private static final int DATABASE_VERSION =1; 
    public static final String KEY_BODY = "Player_Name"; 
    public static final String KEY_ROWID = "_id"; 
    public static final String KEY_TITLE = "Player_Position"; 
    public static final String KEY_NUMBER = "Player_Number"; 
    public static final String KEY_TEAM = "Team"; 
private static final String TAG = "PlayerDbAdapter"; 
    private final Context mCtx; 
    private SQLiteDatabase mDb; 
    private DatabaseHelper mDbHelper; 

    public PlayerDbAdapter(Context paramContext) 
    { 
    this.mCtx = paramContext; 
    } 

    public void close() 
    { 
    this.mDbHelper.close(); 
    } 


    public long createPlayers(String playerName, String playerPosition, String playerNumber, String team) 
    { 
    ContentValues localContentValues = new ContentValues(); 
    localContentValues.put(KEY_BODY, playerName); 
    localContentValues.put(KEY_TITLE, playerPosition); 
    localContentValues.put(KEY_NUMBER, playerNumber); 
    localContentValues.put(KEY_TEAM, team); 
    try{ 
     return this.mDb.insert("Players", null, localContentValues); 
    } catch (Exception e) { 
     Log.e("Juma", e.getMessage()); 
    } 

    return 0; 
    } 

logcat的

04-18 19:28:08.544: E/Database(352): Failure 1 (near "FOREIGN": syntax error) on 0x2b5840 when preparing 'CREATE TABLE if not exists PlayerStats (_id integer PRIMARY KEY autoincrement,PlayerIdinteger FOREIGN KEY (PlayerId) REFERENCES Players (_id),Goals_Scored,Minutes_Played,Substitute_In,Substitute_Out,Booked)'.

是不是因为我不是插入Player_id oNCreate方法?

回答

1

这是修改的例子,我从SQLite documentation了:

CREATE TABLE track(
    KEY_ROWID INTEGER PRIMARY KEY autoincrement, 
    PLAYER_ID INTEGER, 
    KEY_SCORE TEXT, 
    FOREIGN KEY(PLAYER_ID) REFERENCES anotherTable(THE_KEY_ROWID_HERE), 
    FOREIGN KEY(KEY_ROWID, PLAYER_ID) 
      REFERENCES yetAnotherTable(THE_KEY_ROWID_THERE, THE_PLAYER_ID_THERE) 
); 

正如你所看到的,你必须添加外键所有列定义 - 不要试图把他们列定义。你可以有多个,也可以有组合列的外键。

最后是精心打造的SQL字符串时,你的发言:

CREATE TABLE if not exists PlayerStats (
_id  integer PRIMARY KEY autoincrement, 
    PlayerId integer, 
    Goals_Scored, 
    Minutes_Played, 
    ... 

...缺少类型的某些列。

p.s.:这一个应该工作,例如

private static final String TABLE_CREATE = 
    "CREATE TABLE if not exists " + TABLE_NAME + " (" + 
    KEY_ROWID  + " integer PRIMARY KEY autoincrement," 
    ANOTHER_COLUMN + " text" +")"; 

private static final String SQLITE_CREATE = 
    "CREATE TABLE if not exists " + SQLITE_TABLE + " (" + 
    KEY_ROWID + " integer PRIMARY KEY autoincrement," + 
    PLAYER_ID + " integer," 
    KEY_SCORE + " text," + 
    KEY_MINUTES + " text," + 
    KEY_SUBIN + " text," + 
    KEY_SUBOUT + " text," + 
    KEY_BOOKING + " text," 
    +" FOREIGN KEY("+PLAYER_ID+") REFERENCES "+TABLE_NAME+" ("+KEY_ROWID+"))"; 

希望我可以帮助一下。

干杯!

+0

如果我输入'DATABASE_TABLE'这是我在其他班级中提到的表格名称,那么我得到一个错误,我将如何启动它? – b0w3rb0w3r

+0

看看这个小例子;重要的是:首先创建一个依赖关系的原因。 – Trinimon

+0

这工作。但是,我是否从另一个类重新创建同一个表,但仅当它不存在时才是正确的?这不会创建重复的表,并在稍后给我错误?谢谢。 – b0w3rb0w3r

0

您必须在android sqlite中将主键的名称作为_id。

+0

我在两个班都做过这个吗? 'KEY_ROWID'是我的主键。我意识到它们都是相同的,所以我重命名了第二个'KEY_ROWID2',但现在如何将'PLAYER_UD'链接到另一个类中的'KEY_ROWID'? – b0w3rb0w3r

0

根据日志,你必须靠近“洋”,语法错误的清楚,有没有除了整数逗号后的“PlayerId”和“整数”,之间的空间。此外,您没有提交[Goals_Scored,Minutes_Played,Substitute_In,Substitute_Out,Booked]的类型。

我建议学习更多关于SQL查询的知识,您可以先在桌面上使用sqlite。

+0

我没有故意提交类型,只是想查看表是否正在创建。 – b0w3rb0w3r