Relacionamento no Sqlite

SQLite

21/06/2013

Meus amigos, gostaria de saber como fazer os relacionamentos entre tabelas no SQLite. Eu tenho esse script:

private static final String DATABASE_CREATE_CARROS = "create table " + DATABASE_TABLE_CARROS + " ("      
+ KEY_ID_CARRO + " integer primary key autoincrement, "      
+ KEY_IDCLIENTE_CARRO + " integer, "      
+ KEY_IDTIPO_CARRO + " integer, "      
+ KEY_MODELO + " text, "      
+ KEY_PLACA + " text, FOREIGN KEY ( " + KEY_IDCLIENTE_CARRO      
+ " ) REFERENCES " + DATABASE_TABLE_CLIENTES + " (" + KEY_ID_CLI      
+ " ) ON DELETE RESTRICT ON UPDATE CASCADE , FOREIGN KEY ( "       
+ KEY_IDTIPO_CARRO + " ) REFERENCES " + DATABASE_TABLE_TIPO_CARRO + " ("       
+ KEY_IDTIPO_CARRO + " ) ON DELETE RESTRICT ON UPDATE CASCADE);";   


O que poderia fazer para esse script ficasse mais claro e visível? Notem que tenho 2 relacionamentos.
Frederico Brigatte***

Frederico Brigatte***

Curtidas 0

Respostas

Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Ninguém?
GOSTEI 0
Marcelo Senaga

Marcelo Senaga

21/06/2013

Meus amigos, gostaria de saber como fazer os relacionamentos entre tabelas no SQLite. Eu tenho esse script:

private static final String DATABASE_CREATE_CARROS = "create table " + DATABASE_TABLE_CARROS + " ("      
+ KEY_ID_CARRO + " integer primary key autoincrement, "      
+ KEY_IDCLIENTE_CARRO + " integer, "      
+ KEY_IDTIPO_CARRO + " integer, "      
+ KEY_MODELO + " text, "      
+ KEY_PLACA + " text, FOREIGN KEY ( " + KEY_IDCLIENTE_CARRO      
+ " ) REFERENCES " + DATABASE_TABLE_CLIENTES + " (" + KEY_ID_CLI      
+ " ) ON DELETE RESTRICT ON UPDATE CASCADE , FOREIGN KEY ( "       
+ KEY_IDTIPO_CARRO + " ) REFERENCES " + DATABASE_TABLE_TIPO_CARRO + " ("       
+ KEY_IDTIPO_CARRO + " ) ON DELETE RESTRICT ON UPDATE CASCADE);";   


O que poderia fazer para esse script ficasse mais claro e visível? Notem que tenho 2 relacionamentos.


Tem uns frameworks ORM para Android:

http://www.ubiratansoares.com.br/blog/2012/12/consideracoes-sobre-android-e-orm/

GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

O que seria exatamente isso?
GOSTEI 0
Marcelo Senaga

Marcelo Senaga

21/06/2013

É tipo o Hibernate, mas para Android.
Eu vi que você está criando as tabelas "na mão", via comando SQL. É como todo mundo faz. Mas existe esses ORM´s para Android, caso você queira algo mais sofisticado, no estilo do Hibernate. (claro, com certas limitações).
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Movendo o tópico para a nova sala de SQLite.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

E como que funciona?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

E ai, alguém pra ajudar?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Qual é mesmo sua dúvida, Frederico? O que poderia fazer para o script ficar mais "claro e visível"?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Estou em dúvida qto aos relacionamentos. Por exemplo, no script postado acima, crio a tabela Carros? Tenho uma outra tabela chamada Clientes que também vai ter um campo id, como posso resolver esse problema? Em outra tabela chamada Tipo, também vou ter o campo id. E assim para as demais tabelas.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Isso mesmo. Gostaria de deixar mais vísível e claro o script e seus relacionamentos também.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Seria melhor usar o script com os próprios comandos sql ou utilizar constantes? Vou ter que utilizar 05 tabelas, por isso gostaria de um exemplo de código mais limpo e claro.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Bom, aí você vai ter de estudar um pouco sobre relacionamentos (chaves estrangeiras ou foreign keys). O que você está fazendo é criar uma tabela de carros que está relacionada com o cliente e com o tipo. Ou seja, UM CARRO POSSUI UM CLIENTE E UM TIPO.
Com relação ao campo Id, todas as suas tabelas podem ter um campo Id ou com qualquer outro nome, o que não pode é ter dois campos iguais na mesma tabela.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Ja tenho as tabelas prontas com os scripts, queria deixar mais claro e limpo.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Tenho esse script criado:

Tabela Clientes:

private static final String DATABASE_CREATE_CLIENTES = "create table " + DATABASE_TABLE_CLIENTES + " ("
+ KEY_IDCLI + " integer primary key autoincrement, "
+ KEY_NOME + " text, "
+ KEY_ENDERECO + " text, "
+ KEY_TELEFONE + " text, "
+ KEY_CELULAR + " text, "
+ KEY_EMAIL + " text);";


Tabela Carros:

private static final String DATABASE_CREATE_CARROS = "create table " + DATABASE_TABLE_CARROS + " ("     
+ KEY_ID_CARRO + " integer primary key autoincrement, "     
+ KEY_IDCLIENTE_CARRO + " integer, "     
+ KEY_IDTIPO_CARRO + " integer, "     
+ KEY_MODELO + " text, "     
+ KEY_PLACA + " text, FOREIGN KEY ( " + KEY_IDCLIENTE_CARRO      
+ " ) REFERENCES " + DATABASE_TABLE_CLIENTES + " (" + KEY_ID_CLI      
+ " ) ON DELETE RESTRICT ON UPDATE CASCADE , FOREIGN KEY ( "      
+ KEY_IDTIPO_CARRO + " ) REFERENCES " + DATABASE_TABLE_TIPO_CARRO + " ("      
+ KEY_IDTIPO_CARRO + " ) ON DELETE RESTRICT ON UPDATE CASCADE);";   


Tabela Tipo Carros:

   private static final String DATABASE_CREATE_CARROS = "create table " + DATABASE_TABLE_CARROS + " ("    
    + KEY_ID_CARRO + " integer primary key autoincrement, "    
    + KEY_IDCLIENTE_CARRO + " integer, "    
    + KEY_IDTIPO_CARRO + " integer, "    
    + KEY_MODELO + " text, "    
    + KEY_PLACA + " text, FOREIGN KEY ( " + KEY_IDCLIENTE_CARRO    
    + " ) REFERENCES " + DATABASE_TABLE_CLIENTES + " (" + KEY_ID_CLI    
    + " ) ON DELETE RESTRICT ON UPDATE CASCADE , FOREIGN KEY ( "     
    + KEY_IDTIPO_CARRO + " ) REFERENCES " + DATABASE_TABLE_TIPO_CARRO + " ("     
    + KEY_IDTIPO_CARRO + " ) ON DELETE RESTRICT ON UPDATE CASCADE);"; 


Gostaria de deixar mais visível e limpo o código. Já tenho pronto.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Amigo, para mim parece bastante claro. O fato de não parecer "limpo" é por que você está usando essas variáveis /constantes aí ao invés de botar logo os nomes das colunas.
Escreva o script completo, já com os nomes das colunas e verá que parecerá mais claro.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Desse jeito é mais prático?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Desse jeito é mais prático?
Com constantes?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Existe alguma ferramenta visual para sqlite para montar as tabelas e relacionamentos?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Desse jeito é mais prático?

Se você já sabe os nomes das colunas, eu não acho que precise usar constantes para isso.
Isso aí você deve ter pego isso em algum exemplo, certo? Mas não precisa seguir à risca.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Eu que fiz isso ai.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Joel, eu fiz assim:

//  CAMPOS DA TABELA CLIENTES	
	public static final String KEY_ID_CLI = "_id";
	public static final String KEY_NOME = "nome";
	public static final String KEY_ENDERECO = "endereco";
	public static final String KEY_TELEFONE = "telefone";
	public static final String KEY_CELULAR = "celular";
	public static final String KEY_EMAIL = "email";

//  CAMPOS DA TABELA CARROS	
	public static final String KEY_ID_CARRO = "_id";
	public static final String KEY_IDCLIENTE_CARRO = "id_cliente";
	public static final String KEY_IDTIPO_CARRO = "id_tipo_carro";
	public static final String KEY_MODELO = "car_modelo";
	public static final String KEY_PLACA = "car_placa";

//  CAMPOS DA TABELA TIPO_CARRO	
	public static final String KEY_ID_TIP = "_id";
	public static final String KEY_TIPDESC = "tip_descricao";


Como poderia fazer nos campos do tipo KEY_ID.....? Porque id vou ter em todas as tabelas.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Como poderia fazer o que? Não entendi a dúvida, pois como eu já disse, você pode ter uma coluna Id em todas as tabelas, não há problema.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Joel, acho que não fui claro, desculpe. Me refiro aos campos que chaves. Exemplo:

KEY_ID_CLI = "_id";
KEY_IDCLIENTE_CARRO = "id_cliente";

//  CAMPOS DA TABELA CLIENTES   
    public static final String KEY_ID_CLI = "_id";
 
//  CAMPOS DA TABELA CARROS 
    public static final String KEY_ID_CARRO = "_id";
    public static final String KEY_IDCLIENTE_CARRO = "id_cliente";
    public static final String KEY_IDTIPO_CARRO = "id_tipo_carro";
 
//  CAMPOS DA TABELA TIPO_CARRO 
    public static final String KEY_ID_TIP = "_id";


Teria alguma forma de usar o mesmo quando for para outra tabela como no exemplo acima?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Dessa forma está correto. Eu tenho uma coluna Id nas tabelas CARROS, CLIENTES e TIPOS_CARROS, certo?
Quando eu for referenciá-las em outras tabelas, é interessante e comum criar uma coluna com um nome significativo, como você está fazendo (id_cliente, id_tipo_carro).
Não vejo por que mudar alguma coisa aí.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Ok, somente o nome das constantes, caso queira outro, correto?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Perfeitamente, é só seguir como você está fazendo atualmente.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Joel, para concluir:

Os relacionamentos são feitos somente por script?

Exemplo:
private static final String DATABASE_CREATE_CARROS = "create table " + DATABASE_TABLE_CARROS + " ("     
+ KEY_ID_CARRO + " integer primary key autoincrement, "     
+ KEY_IDCLIENTE_CARRO + " integer, "     
+ KEY_IDTIPO_CARRO + " integer, "     
+ KEY_MODELO + " text, "     
+ KEY_PLACA + " text, FOREIGN KEY ( " + KEY_IDCLIENTE_CARRO      
+ " ) REFERENCES " + DATABASE_TABLE_CLIENTES + " (" + KEY_ID_CLI      
+ " ) ON DELETE RESTRICT ON UPDATE CASCADE , FOREIGN KEY ( "      
+ KEY_IDTIPO_CARRO + " ) REFERENCES " + DATABASE_TABLE_TIPO_CARRO + " ("      
+ KEY_IDTIPO_CARRO + " ) ON DELETE RESTRICT ON UPDATE CASCADE);";   


Não teria alguma ferramenta visual para fazer? Iria facilitar muito.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Joel, poderia usar assim: KEY_OS_ID-CLIENTE

Exemplo:
public static final String KEY_OS_ID-CLIENTE = "id_cliente";
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Joel, poderia usar assim: KEY_OS_ID-CLIENTE

Exemplo:
public static final String KEY_OS_ID-CLIENTE = "id_cliente";


Não dá, rs, acabei de testar. Não aceita "-"
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Joel, poderia usar assim: KEY_OS_ID-CLIENTE

Exemplo:
public static final String KEY_OS_ID-CLIENTE = "id_cliente";

O nome da constante não importa, não influencia em NADA. O que você deve prestar atenção é no nome das colunas.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Joel, como que quebro uma linha no script:

private static String sql = "CREATE TABLE [clientes] (  [id] INTEGER PRIMARY KEY AUTOINCREMENT,   [nome] [VARCHAR(30)],   [email] [VARCHAR(40)],   [endereco] [VARCHAR(50)],   [numero] [VARCHAR(10)]);";


No meu ta tudo numa linha só.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Joel, quando fiz KEY_OS_ID-CLIENTE, ficou sublinhado de vermelho o "-" no eclipse.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Joel, como que quebro uma linha no script:

private static String sql = "CREATE TABLE [clientes] (  [id] INTEGER PRIMARY KEY AUTOINCREMENT,   [nome] [VARCHAR(30)],   [email] [VARCHAR(40)],   [endereco] [VARCHAR(50)],   [numero] [VARCHAR(10)]);";


No meu ta tudo numa linha só.
Para quebrar a linha é só fazer como você fez anteriormente, usando +, afinal, isso é só uma string como outra qualquer.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Joel, quando fiz KEY_OS_ID-CLIENTE, ficou sublinhado de vermelho o "-" no eclipse.
Obviamente sublinho o traço, pois não é um caractere válido para nomear variáveis. Você só pode usar o underlinhe (_).
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Sobre as ferramentas frontend, veja este link: [url]https://www.sqlite.org/cvstrac/wiki?p=ManagementTools[/url].
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Qual dessas ai, free, é boa e que tenha possibilidade de fazer relacionamentos?

SQLite2009 Pro Enterprise Manager essa seria uma boa?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Não sei te dizer, teria de pesquisar. Inclusive, até lhe peço pra dizer depois o que achou.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Poderia me dizer então qual dos free posso baixar para testar e que tenha opções para relacionamentos visuais.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Poderia me dizer então qual dos free posso baixar para testar e que tenha opções para relacionamentos visuais.
Como eu disse, tem de olhar nesse link que lhe passei ou entrando em cada um para verificar.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Como vou saber se tem opção de relacionamentos?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Como vou saber se tem opção de relacionamentos?
Novamente: entre em cada site e procure conhecer cada ferramenta.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Ok, estou verificando. Mas sabendo de alguma ferramenta free, poste aqui, ok?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Com certeza, esteja certo que avisarei aqui sobre qualquer novidade que tenha.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

E esse frameworks ORM para Android:

http://www.ubiratansoares.com.br/blog/2012/12/consideracoes-sobre-android-e-orm/

GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Para utilizar qualquer framework ORM é preciso primeiramente entender como funciona para saber o que esperar. Sugiro pesquisar a respeito, pois ORM é muito interessante.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Tem alguma documentação sobre orm?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Tem alguma documentação sobre orm?
Não tenho nada em especial que possa lhe indicar, mas há muita coisa na net, tenho certeza que encontrará algo a respeito.
Eu, pelo menos, não tive dificuldade quando comecei a estudar.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Como que usa esse ORM?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Cara, basicamente ele mapeia seu banco de dados e cria uma estrutura de classes correspondentes na sua aplicação. Por exemplo: eu tenho a tabela Carros, então será criada uma classe Carros com uma coleção de objetos (Carro, no singular, por exemplo). A partir dessas classes é possível manipular os dados sem usar SQL e tudo será persistido no banco.
Como eu disse, pesquise a respeito e leia a documentação, é fundamental.

Boa sorte.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Vou pesquisar, qquer novidade poste aqui, ok?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/06/2013

Ok. Avise aqui quando pudermos fechar o tópico, que é referente aos scripts.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/06/2013

Combionado.
GOSTEI 0
POSTAR