2016-08-18 121 views
0

当我删除一个聊天行时,我想删除所有消息行以及使用该id_chat创建的所有关系行。我在这一点上添加寄存器没有问题,但删除了关系和消息寄存器,因为它们不会自动消失。级联删除,错误FOREIGN KEY约束失败,sqlite

public void onOpen(SQLiteDatabase db){ 
    super.onOpen(db); 
    db.execSQL("PRAGMA foreign_keys = ON"); 
} 

编辑: 现在加入中关系的第一个寄存器(1.17)

public class DatabaseHelper extends SQLiteOpenHelper { 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE Chats (_id INTEGER PRIMARY KEY AUTOINCREMENT, A1 DATE)"); 
     db.execSQL("CREATE TABLE Messages (_id INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(id_user) REFERENCES Users(id_user), FOREIGN KEY(id_chat) REFERENCES Chats(_id) ON DELETE CASCADE)"); 
     db.execSQL("CREATE TABLE Relations (id_viaje INTEGER, id_chat INTEGER, PRIMARY KEY (id_chat, id_viaje), FOREIGN KEY (id_chat) REFERENCES Chats(_id) ON DELETE CASCADE, FOREIGN KEY (id_viaje) REFERENCES Viajes(_id))"); 
     db.execSQL("CREATE TABLE Users (_id INTEGER AUTO_INCREMENT, id_user TEXT PRIMARY KEY, name TEXT)"); 
     db.execSQL("CREATE TABLE Viajes (_id INTEGER PRIMARY KEY AUTOINCREMENT, date DATE, activate BOOLEAN, id_user TEXT not null)"); 
    } 
} 

因此,正如我在读计算器我为了激活外键推翻方法onOpen第二个(3,17)给我在本地分贝错误:

Error inserting id_viaje=3 id_chat=17 android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed 

为什么这个错误?如何在级联上删除? 感谢

回答

0

Chats没有一个名为id_chat

列,以便在表Relations这个外键声明是无效的:

FOREIGN KEY (id_chat) REFERENCES Chats(id_chat) ON DELETE CASCADE 
             ^^^^^^^ 

问题是标记为 “MySQL的”,但看起来你实际上使用的是SQLite而不是MySQL。两者之间有一些差异。例如,PRAGMA foreign keys在MySQL中无效。

+0

你是对的,我编辑它。谢谢。在Relations中创建寄存器仍然存在一些问题,我创建它的每个聊天应该至少创建两个关系寄存器,我只能插入第一个。 – lulu666

0

我的解决方案是删除id_viaje作为我的表关系中的外键。只是:

db.execSQL("CREATE TABLE Relations (id_viaje INTEGER, id_chat INTEGER, PRIMARY KEY (id_chat, id_viaje), FOREIGN KEY (id_chat) REFERENCES Chats(_id) ON DELETE CASCADE)"); 

约束例外消失并且在级联上删除工作。

不知道为什么会发生这种情况,因为id_viaje和id_chat都是我服务器中的外键,添加或删除寄存器时没有任何问题。