Eu tenho duas tabelas: trilhas e waypoints, uma trilha pode ter muitos waypoints, mas um waypoint é atribuído a apenas 1 trilha.
Na tabela de pontos de maneira, tenho uma coluna chamada "trackidfk" que insere o track_ID assim que uma trilha é feita, no entanto, não configurei restrições de chave estrangeira nesta coluna.
Quando apago uma trilha, quero apagar os waypoints atribuídos, isso é possível? Eu li sobre o uso de Triggers, mas não acho que eles sejam suportados no Android.
Para criar a tabela de waypoints:
public void onCreate(SQLiteDatabase db) {
db.execSQL( "CREATE TABLE " + TABLE_NAME
+ " ("
+ _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ LONGITUDE + " INTEGER,"
+ LATITUDE + " INTEGER,"
+ TIME + " INTEGER,"
+ TRACK_ID_FK + " INTEGER"
+ " );"
);
...
}
fonte
PRAGMA
declarações em,onConfigure()
mas requer nível de API 16 (Android 4.1), e então você pode simplesmente chamarsetForeignKeyConstraintsEnabled
.onCreate
/onDowngrade
/onUpgrade
, que são anterioresonOpen
. Veja o código-fonte no Android 4.1.1 .Desde Android 4.1 (API 16), SQLiteDatabase suporta:
fonte
Como a postagem de e.shishkin diz da API 16 em diante, você deve habilitar as restrições de chave estrangeira no
SqLiteOpenHelper.onConfigure(SqLiteDatabase)
método usando odb.setForeignKeyConstraintsEnabled(boolean)
fonte
Nunca é uma pergunta muito velha para responder com uma resposta mais completa.
fonte
Tudo o que @phil mencionou é bom. Mas você pode usar outro método padrão disponível no próprio banco de dados para definir a chave estrangeira. Isso é setForeignKeyConstraintsEnabled (true).
Para documentos, consulte SQLiteDatabase.setForeignKeyConstraintsEnabled
fonte
A good time to call this method is right after calling openOrCreateDatabase(File, SQLiteDatabase.CursorFactory) or in the onConfigure(SQLiteDatabase) callback.
Então, em vez deonOpen
,onConfigure
parece ser o lugar certo.Não acho que o SQLite suporte isso fora da caixa. O que estou fazendo em meus aplicativos é:
Dessa forma, tenho certeza de que todos os dados foram excluídos ou nenhum.
fonte
Os gatilhos são compatíveis com o Android e esse tipo de exclusão em cascata não é compatível com o sqlite. Um exemplo de uso de gatilhos no Android pode ser encontrado aqui . Embora usar transações como Thorsten declarou, provavelmente seja tão fácil quanto um gatilho.
fonte
A versão do SQLite no Android 1.6 é 3.5.9, por isso não suporta chaves estrangeiras ...
http://www.sqlite.org/foreignkeys.html "Este documento descreve o suporte para restrições de chave estrangeira SQL introduzidas no SQLite versão 3.6.19."
No Froyo é SQLite versão 3.6.22, então ...
EDITAR: para ver a versão sqlite: adb shell sqlite3 -version
fonte
Chaves estrangeiras com "on delete cascade" são suportadas no SQLite no Android 2.2 e superior. Mas tenha cuidado ao usá-los: às vezes, um erro é relatado ao disparar uma chave estrangeira em uma coluna, mas o problema real está em outra restrição de chave estrangeira de coluna na tabela filha, ou em alguma outra tabela que faz referência a esta tabela.
Parece que o SQLite verifica todas as restrições ao iniciar um deles. Na verdade, é mencionado na documentação. Verificações de restrição DDL versus DML.
fonte
Se você estiver usando o Android Room, siga as instruções abaixo.
fonte