2012-04-13 47 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