Simulador Não Valida FK



  • O simulador não esta validando as FK.
    Abri o banco de dados do SQL Lite e notei que o gerador não criou as FK.

    Como devemos proceder?


  • Bom dia!
    Até a versão 2.6 (que temos aqui) e segundo o hel do Maker, os bancos de dados homologados são esses:
    PostgreSQL 8.2.5;
    MS-SQL Server 2000/2005/2008;
    Firebird 1.5/2.0;
    Oracle 10G/9i;
    MySQL 5.0.

    Esse problema não estaria relacionado a esta questão? Você está usando um SGDB não homologado?

    alexandro.sousa


  • Boa tarde Alexandre.

    Esse problema esta acontecendo no banco que do SQLLite que o maker mobile gera.

    Não acredito ter haver com o banco pois fizemos o teste em outras verões incluindo as homologadas e o Maker Mobile não gera as FK.
    Deixando deletar os registro com referencia.

    Abrimos o banco gerado pelo Maker Mobile e la não tem nenhuma FK que foi criado no projeto.
    Ou seja ele não exportou direito.


  • Pessoal,

    O produto não utiliza as FKs no SQLite pois o suporte a Foreing Keys (FK) só existe a partir da versão 3.6.19 (http://www.sqlite.org/foreignkeys.html), neste cenário não há como assumir que tal funcionalidade estará disponível em todas as versões de Android, iOS e BlackBerry suportadas atualmente. Por exemplo, o HTC Hero com Android 2.1 vem com a versão 3.5.9 (http://stackoverflow.com/questions/2421189/version-of-sqlite-used-in-android), assim como muitos outros dispositivos com a versão 2.1 do Android.

    Além disso, não é seguro assumir que o suporte a FK esteja habilitado, como podemos observar na documentação oficial do SQLite uma diretiva de compilação pode remover tal recurso, ou seja, você teria que conferir aparelho por aparelho para ter certeza que aquele modelo foi compilado com suporte a FK ativo.

    Considerando tal cenário, e querendo assumir o risco de ter uma aplicação que não irá funcionar em alguns aparelhos você pode ativar o suporte a FK. Para tal basta executar um fluxo no primeiro acesso a aplicação que execute os comandos SQL para criar as tabelas com as FKs ativas, ignorando total ou parcialmente o script original gerado pelo compilador, ou mesmo, alterar os comandos gerados (arquivo "rules.js") para se obter o resultado desejado, lembre-se de ativar/desativar a pragma de FK durante os inserts de carga de dados para evitar problemas de sequencia de inserts.

    É importante ter em mente que os dados armazenados no celular são temporários, e não confiáveis em todos os sentidos:
    - O aparelho pode ser perdido/roubado;
    - Pode ser apagado pelo operador, através de comandos do aparelho;
    - Os dados podem ter sido adulterados;
    - Pode faltar espaço em disco;

    Outro ponto a ser considerado é a fragmentação dos registros, normalmente não é prudente enviar tudo para o celular, isso iria consumir os recursos escassos do aparelho, tanto de memória, armazenamento, processamento e consumo de energia comprometendo operacionalização dos softwares.

    Um caso clássico seria uma aplicação de venda onde um representante comercial vai visitar seus clientes de Sergipe, não seria prudente popular a tabela de municipio com os mais de 5.500 municipios do Brasil, estariamos sobrecarregando o sistemas com informações que muito provavelmente não serão usadas, ainda que no cadastro de um cliente ou outro tenha referencias a outros estados/municipios.

    Assim, a integradidade referencial deixa de ser um requisito essencial e passa a ser algo desejável apenas, os dados integros e seguros devem sempre estar no servidor e no mobile só o mínimo necessário para operação, ou mesmo utilizando-se técnicas similares a "lazzy fetch" para carga de dados sob demanda.

    Referencias:
    * http://www.sqlite.org/foreignkeys.html
    * http://www.simpligility.com/2010/08/referential-integrity-with-sqlite-on-android-the-lazy-way/
    * http://stackoverflow.com/questions/2421189/version-of-sqlite-used-in-android
    * http://www.sqlite.org/lang_altertable.html
    * http://www.innerexception.com/2010/11/sqlite-versions-correlated-to-ios.html
    * http://en.wikipedia.org/wiki/Lazy_loading

    Atenciosamente,

Log in to reply