2012-04-13 74 views
1

我測試Android中的外鍵,我有問題,我不明白:的Android SQLite和外鍵遇事

創建表(通過硬編碼值)

db.execSQL("CREATE TABLE IF NOT EXISTS table_A (" + 
      "_id long primary key , value1 long );"); 
db.execSQL("CREATE TABLE IF NOT EXISTS table_B (" + 
      "_id long primary key , value1fk long , value2 long,"+ 
      "FOREIGN KEY (value1fk) REFERENCES table_A (value1) ON DELETE CASCADE);"); 

然後我執行:

ContentValues values = new ContentValues(); 
    values.put("_id", 1); 
    values.put("value1", 200); 
    long result = mDb.insert("table_A", null, values); 
    Log.e("","done (" + result + ")"); 


    values = new ContentValues(); 
    values.put("_id", 1); 
    values.put("value1fk", 200); 
    values.put("value2", 10); 
    result= mDb.insert("table_B", null, values); 
    Log.e("","done (" + result + ")"); 

輸出是

done(1) 
done(-1) 

給予二次插入的外鍵不匹配

E/SQLiteDatabase(25476): Error inserting _id=1 value1fk=200 value2=10 
E/SQLiteDatabase(25476): android.database.sqlite.SQLiteException: foreign key mismatch: , while compiling: INSERT INTO table_B(_id,value1fk,value2) VALUES (?,?,?) 

這是爲什麼發生?

+0

這是在副本中的錯誤與後來的代碼(編輯) – Addev 2012-04-13 15:53:55

回答

10

據外鍵的SQLite文檔 http://www.sqlite.org/foreignkeys.html 您需要:

  • 使用的主鍵作爲外鍵

    外鍵(value1fk)參考文獻表-A(_id)

  • 使用唯一列作爲外鍵

    CREATE TABLE IF NOT EXISTS table_A(_id long primary key,value1 long UNIQUE);

+0

是的,問題是唯一的!感謝您的答案! – Addev 2012-04-13 16:19:42

1

table_A中的value_1字段不是主鍵。它不應該是

FOREIGN KEY (value1fk) REFERENCES table_A (_id)... 

取而代之?

+0

不,我想引用該字段值1粘貼。它確實有一個錯誤可能不是主鍵,但是我正在使用「CREATE TABLE IF NOT EXISTS table_A(_id long,value1 long,PRIMARY KEY(_id,value1));」並有相同的錯誤 – Addev 2012-04-13 16:12:21