2013-12-14 2 views
0

Я пытаюсь создать связь между 2 таблицами, но FK не заполняется. он остается равным нулю. Ниже мой кодandroid sqlite внешний ключ не работает

public static final int DATABASE_VERSION = 1; 
// Database Name 
public static final String DATABASE_NAME = "LocalRugbyDB.db"; 

//table names 
public static final String TABLE_PLAYER_INFO = "PLAYER_Local"; 
public static final String TABLE_TEAM_INFO = "TEAM_local"; 

//add fields to player table 
public static final String KEY_PLAYER_ID = "_id"; 
public static final String KEY_FNAME = "first_name"; 
public static final String KEY_LNAME = "last_name"; 
public static final String KEY_AGE = "age"; 
public static final String KEY_HEIGHT = "height"; 
public static final String KEY_WEIGHT = "weight"; 
public static final String KEY_POSITION = "position"; 
public static final String KEY_TEAM = "team"; 
public static final String TEAM_ID = "team_id"; 

// add field to team table 
public static final String KEY_TEAM_ID = "_id"; 
public static final String KEY_TEAMNAME = "team_name"; 

public MySQLiteHelper(Context context, String name, 
     CursorFactory factory, int version) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    Log.i("onCreateMaybe", "Created"); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    // SQL statement to create book table 
    String CREATE_PLAYER_TABLE = "CREATE TABLE " + TABLE_PLAYER_INFO + "(" 
      + KEY_PLAYER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
      + KEY_FNAME + " TEXT," 
      + KEY_LNAME + " TEXT," 
      + KEY_POSITION + " TEXT," 
      + KEY_HEIGHT + " TEXT," 
      + KEY_AGE + " TEXT," 
      + KEY_WEIGHT + " TEXT," 
      + KEY_TEAM + " TEXT," 
      + TEAM_ID + " integer," 
      + " FOREIGN KEY ("+TEAM_ID+") REFERENCES "+TABLE_TEAM_INFO+" ("+KEY_TEAM_ID+"));"; 


    String CREATE_TEAM_TABLE = "CREATE TABLE " + TABLE_TEAM_INFO + "(" 
      + KEY_TEAM_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
      + KEY_TEAMNAME + " TEXT" + ");"; 

    // create books table 
    db.execSQL("PRAGMA foreign_keys = ON;"); 
    db.execSQL(CREATE_TEAM_TABLE); 
    db.execSQL(CREATE_PLAYER_TABLE); 

} 

здесь вы можете увидеть, что столбец FK (team_id) не заселяется. im не получал никакой ошибки и пытался исправить это в течение нескольких часов. enter image description here

+0

Как вы вставляя данные? Когда я делаю такие вещи, сначала создаю «чужую» строку (команду) и, используя сгенерированный FK, затем вставляем строку в зависимую таблицу (игрока). Могут быть более легкие способы сделать это, но это работает. Кроме того, вы можете добавить некоторые квалификаторы, чтобы исключить значение FK. –

ответ

4

Внешние ключи - это механизм, обеспечивающий согласованность базы данных; они делают не автоматически просматривают значения из других таблиц.

Вам все равно придется выполнять всю работу самостоятельно. Единственное различие заключается в том, что база данных не позволит вам внести противоречивые изменения.


Ваша база данных не соответствует нормали; имя команды дублируется во всех записях игроков. Просто отпустите KEY_TEAM из таблицы игроков.

Для вставки нового игрока с правильной командой ID, вы должны использовать такой код:

long lookupOrCreateTeamID(String name) { 
    Cursor c = db.query(TABLE_TEAM_INFO, new String[] { KEY_TEAM_ID }, 
         KEY_TEAMNAME + " = ?", new String[] { name }, 
         null, null, null); 
    if (c.moveToFirst()) 
     return c.getLong(0); 
    else { 
     ContentValues cv = new ContentValues(); 
     cv.put(KEY_TEAMNAME, name); 
     return db.insert(TABLE_TEAM_INFO, null, cv); 
    } 
} 

long createPlayer(String firstName, ..., String teamName) { 
    ContentValues cv = new ContentValues(); 
    cv.put(KEY_FNAME, firstName); 
    ... 
    cv.put(TEAM_ID, lookupOrCreateTeamID(teamName)); 
    return db.insert(TABLE_PLAYER_INFO, null, cv); 
} 

Пожалуйста, обратите внимание, что PRAGMA foreign_keys должны быть выполнены снова каждое соединения, которое открывает базы данных. Таким образом, вы не должны делать это в onCreate, но в onConfigure (если вы используете уровень API 16):

@Override 
public void onConfigure(SQLiteDatabase db) { 
    db.setForeignKeyConstraintsEnabled(true); 
} 
+0

Спасибо за db.setForeignKeyConstraintsEnabled (true); !!! –

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