【问题标题】:Foreign Key Syntax Error Table not being created未创建外键语法错误表
【发布时间】:2013-04-19 13:37:14
【问题描述】:

由于 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)'.

是因为我没有在 oNCreate 方法中插入 Player_id 吗?

【问题讨论】:

    标签: android sqlite foreign-keys


    【解决方案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+"))";
    

    希望我能帮上点忙。

    干杯!

    【讨论】:

    • 如果我输入 DATABASE_TABLE 这是我在其他类中引用的表名,我会收到错误,我将如何启动它?
    • 看看小例子;重要:首先创建上面的,依赖的原因。
    • 这行得通。但是,我是否要从其他类重新创建同一张表,但前提是它不存在正确?这不会创建重复的表并在以后给我错误?谢谢。
    • 这正是if not exists 的用途。只有创建表的顺序很重要。
    【解决方案2】:

    你必须在 android sqlite 中将主键的名称命名为 _id。

    【讨论】:

    • 我在两个班级都这样做了,不是吗? KEY_ROWID 是我的主键。我意识到它们是相同的,所以我将第二个重命名为 KEY_ROWID2,但现在如何将 PLAYER_UD 链接到不同类别的 KEY_ROWID
    【解决方案3】:

    根据日志,“FOREIGN”附近有语法错误,很明显“PlayerId”和“integer”之间没有空格,除了整数后面的逗号。此外,您没有提交 [Goals_Scored,Minutes_Played,Substitute_In,Substitute_Out,Booked] 的类型。

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

    【讨论】:

    • 我不是故意提交类型只是想看看是否正在创建表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2011-09-13
    相关资源
    最近更新 更多