2016-08-18 13 views
0

チャット行を削除すると、すべてのメッセージ行と、そのid_chatで作成されたすべてのリレーション行が削除されます。私はこの時点ではレジスタを追加することに問題はありませんが、リレーションとメッセージレジスタは自動的に消えないので削除しています。削除カスケードで、エラーFOREIGN KEY制約が失敗しました。sqlite

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

編集: そして今、関係の最初のレジスタが追加されました(1,17)私はstackoverflowの中で読んで

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をオーバーライド2番目のもの(3,17)はローカルデータベースにエラーを表示します:

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

なぜこのエラーが発生しますか?どのようにカスケードで削除するには?だから、テーブルRelationsでこの外部キーの宣言は有効ではありません おかげ

答えて

0

Chatsid_chat

という名前の列を持っていません。

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

質問が「mysqlの」でタグ付けされ、実際にはMySQLではなくSQLiteを使用しているようです。両者にはいくつかの違いがあります。たとえば、PRAGMA foreign keysはMySQLでは無効です。

+0

あなたが正しいです、私はそれを編集しました。ありがとう。リレーションシップでレジスタを作成する際に問題が発生しても、作成するすべてのチャットでリレーションを2つ以上作成する必要があります。最初のチャンクしか挿入できません。 – 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の両方が自分のサーバー内の外部キーであり、レジスタの追加または削除時に問題がないため、なぜこのようなことが起こるかわかりません。

関連する問題