2013-04-27 342 views
3

我已经在Android应用程序创建我sqlLite DB验证码:android.database.sqlite.SQLiteConstraintException:外键约束失败(代码19)

private static final String CREATE_TABELLA_PERSONE = "CREATE TABLE TB_PERSONE " 
+ "(_ID integer," 
+ "CODICE_PERSONA text not null, DESC_PERSONA text null, " 
+ "PRIMARY KEY (CODICE_PERSONA));"; 

private static final String CREATE_TABELLA_USCITE = "CREATE TABLE AN_USCITE " 
+ "(_ID integer, " 
+ "CODICE_USCITA text null, SCADENZA text null, DATA text null," 
+ "PERSONA text not null REFERENCES TB_PERSONE(CODICE_PERSONA) ON DELETE NO ACTION ON UPDATE  CASCADE,PRIMARY KEY(CODICE_USCITA));"; 

当我调用函数DELETE在“TB_PERSONE”中排一行

public int SQLdelete(String tabella, String id) { 
    return database.delete(tabella, "_ID=" + id, null); 
} 

该应用程序向我显示此错误:

04-27 11:15:27.152: E/AndroidRuntime(22031): FATAL EXCEPTION: main 
04-27 11:15:27.152: E/AndroidRuntime(22031): android.database.sqlite.SQLiteConstraintException:   
foreign key constraint failed (code 19) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:727) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1494) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at it.jackpot21.personalmoney.DbAdapter.SQLdelete(DbAdapter.java:89) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at it.jackpot21.personalmoney.PersoneActivity$5.onClick(PersoneActivity.java:215) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at android.view.View.performClick(View.java:4084) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at android.view.View$PerformClick.run(View.java:16966) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at android.os.Handler.handleCallback(Handler.java:615) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at android.os.Handler.dispatchMessage(Handler.java:92) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at android.os.Looper.loop(Looper.java:137) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at android.app.ActivityThread.main(ActivityThread.java:4745) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at java.lang.reflect.Method.invokeNative(Native Method) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at java.lang.reflect.Method.invoke(Method.java:511) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
04-27 11:15:27.152: E/AndroidRuntime(22031): at dalvik.system.NativeStart.main(Native Method) 

有人可以帮我吗?
非常感谢! :)

编辑:
我解决了它通过把ON DELETE SET NULL
谢谢!

+0

你试过了什么?检查此链接:http://stackoverflow.com/questions/8117685/android-database-sqlite-sqliteconstraintexception-error-code-19-constraint-fai – Maulik 2013-04-27 11:55:54

+0

,并检查这一个:http://stackoverflow.com/questions/ 14929277/error-inserted-android-database-sqlite-sqliteconstraintexception-error-code-19 – Maulik 2013-04-27 12:01:41

回答

0

这意味着AN_USCITE表中仍包含一些引用您要删除的人的记录。

2

看起来您正在从TB_PERSONE删除一条记录,该记录来自表AN_USCITE的记录。

所以,

1)删除该记录从AN_USCITETB_PERSONE删除记录之前。

2)设置ON DELETE CASCADE在你的外键的定义:

... 
PERSONA text not null REFERENCES TB_PERSONE(CODICE_PERSONA) ON DELETE CASCADE ... 
... 
+0

但是我不能删除'AN_USCITE'中的记录,如果我在'TB_PERSONE'中删除一个记录。 – Hikari 2013-04-28 06:25:34

+0

如果你仍然需要AN_USCITE,你可能需要一些映射表 – Kitesurfer 2014-04-04 01:25:50

0

请确保String id没有空,因此您在下面的代码可以执行。

public int SQLdelete(String tabella, String id) { 
    return database.delete(tabella, "_ID=" + id, null); 
}