Página principal

Usando SQLite com Java no Eclipse

From CInLUG

Conteúdo

Cenário

Nos cursos de computação do Centro de Informática temos duas disciplinas um tanto relacionadas entre si: Gerenciamento de Dados e Informação (ou GDI) e Engenharia de Software e Sistemas (doravante chamada de ES). É prática comum dos grupos de alunos usarem o mesmo projeto para as duas disciplinas e ganhar (ou deixar de perder) algum tempo. Para meu grupo o problema começou quando vimos que não poderíamos usar toda a camada de dados da nossa aplicação pois por alguns motivos não teríamos como usar o servidor de banco de dados usado em GDI na versão do projeto para disciplina de ES. Em vez de rescrever tudo acessando arquivos de texto, preferimos experimentar SQLite. Como tudo que se faz nesse departamento é em Java, este é um breve tutorial de como usar SQLite com a linguagem da Sun na plataforma Eclipse.

SQLite

Segundo o site oficial, SQLite é uma pequena biblioteca em C que implementa um sistema de gerenciamento de banco de dados relacional que aceita comandos SQL. Por se tratar de uma biblioteca bem pequena (cerca de 200Kb), é muito usada em sistemas embutidos, e a página do SQLite na wikipedia possui uma lista de aplicações que usam a biblioteca, até mesmo o OpenOffice.org.

Visite o site oficial para:

Ferramentas

Existem diversas ferramentas para manipular bases de dados (arquivos) SQLite, inclusive do tipo Web, via linguagens como PHP ou Python. Se você quiser brincar um pouco com SQLite sem programar, pode instalar o terminal sqlite. Se estiver no Debian/Ubuntu, o pacote é sqlite3, ou se estiver no MS Windows, pode baixá-lo aqui sqlite-3_3_7.zip. Depois de instalar, chame o terminal sqlite3 na linha de comando, então .help para ver o que pode fazer. Obviamente, conhecimentos de SQL são um pré-requisito.

Java

Como disse antes, o objetivo deste tutorial é usar SQLite com Java. No site SQLiteJDBC podemos encontrar wrappers do SQLite para Java nas plataformas Linux, Windows e Mac OS X. Os arquivos são um .jar e um .so (ou .dll para o Windows) que devem ser incluídos com os fontes da aplicação que faz uso da biblioteca. Baixe o pacote para o ambiente desejado (ou mais de um) e descompacte em algum lugar, agora vamos para próxima parte desse tutorial.


Recordes

Diagrama ER.
Diagrama ER.

Pra ficar minimamente interessante vamos criar uma aplicação de demonstração do SQLite em Java: um banco de dados de recordes em jogos de videogame. Não é grandes coisas, não tem utilidade prática, mas ei!, isso é um tutorial, e um demo é melhor que nada. :P

Classes

O projeto SQLiteDemo é composto de apenas 3 classes, a mais interessante é a DBConnection, onde acontece a interação com o banco de dados, via JDBC.

HiScore

Diagrama UML do objeto HiScore que representa uma linha na tabela HiScores do banco de dados.
Diagrama UML do objeto HiScore que representa uma linha na tabela HiScores do banco de dados.

Esta é apenas uma classe de dados básica, que poderia muito bem ser substituída por uma string e um inteiro, mas vamos fazer a coisa do jeito certo, com atributos privados e get/sets.

  1. public class HiScore {
  2. private String jogo;
  3. private int score;
  4. public HiScore(String jogo, int score) {
  5. this.jogo = jogo;
  6. this.score = score;
  7. }
  8.  
  9. public String getJogo() {
  10. return jogo;
  11. }
  12.  
  13. public void setJogo(String jogo) {
  14. this.jogo = jogo;
  15. }
  16.  
  17. public int getScore() {
  18. return score;
  19. }
  20.  
  21. public void setScore(int score) {
  22. this.score = score;
  23. }
  24. }
  25.  

DBConnection

Com esta classe e mais R$ 1,00 você pode tomar um refrigerante em qualquer birosca.
Com esta classe e mais R$ 1,00 você pode tomar um refrigerante em qualquer birosca.

Esta classe abstrai o acesso ao banco de dados para qualquer entidade que a utilizar, oferecendo apenas operações de inserção, remoção e atualização de dados; se por debaixo roda um bd controlado pelo SQLite, uma planilha ou um simples arquivo CSV (Comma-Separated Values), não interessa a quem chama.

Os métodos são explicados nos comentários no próprio código.

  1. import java.sql.*;
  2. import java.util.Vector;
  3.  
  4. public class DBConnection {
  5. private Connection conn;
  6. private Statement stm;
  7. /**
  8. * O construtor cria uma nova conexão com o banco de dados sqlite contido
  9. * no arquivo passado como parâmetro. A conexão é possibilitada pelo driver
  10. * JDBC, fornecido por SQLiteJDBC.
  11. */
  12. public DBConnection(String file) throws SQLException, ClassNotFoundException {
  13. Class.forName("org.sqlite.JDBC");
  14. this.conn = DriverManager.getConnection("jdbc:sqlite:" + file);
  15. this.stm = this.conn.createStatement();
  16. }
  17. /**
  18. * Cria uma nova tabela de recordes, apagando tudo que houvesse na base
  19. * anteriormente.
  20. */
  21. public void initDB() {
  22. try {
  23. this.stm.executeUpdate("DROP TABLE IF EXISTS Recordes");
  24. this.stm.executeUpdate("CREATE TABLE Recordes (" +
  25. "jogo varchar(50) PRIMARY KEY NOT NULL," +
  26. "score integer);");
  27. } catch (SQLException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. /**
  32. * Adiciona uma nova linha na tabela de recordes.
  33. * @param score
  34. */
  35. public void addHiScore(HiScore score) {
  36. try {
  37. this.stm = this.conn.createStatement();
  38. this.stm.executeUpdate("INSERT INTO Recordes VALUES (\"" +
  39. score.getJogo() + "\"," +
  40. String.valueOf(score.getScore()) + ")");
  41. } catch (SQLException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. /**
  46. * Remove a linha da tabela cuja coluna "jogo" seja igual a string passada
  47. * como parâmetro.
  48. * @param jogo
  49. */
  50. public void removeHiScore(String jogo) {
  51. try {
  52. this.stm = this.conn.createStatement();
  53. this.stm.executeUpdate("DELETE FROM Recordes WHERE " +
  54. "jogo=\"" + jogo + "\"");
  55. } catch (SQLException e) {
  56. e.printStackTrace();
  57. }
  58. }
  59. /**
  60. * Altera o valor de uma linha do banco de dados.
  61. * @param hiScore
  62. */
  63. public void atualizaHiScore(HiScore hiScore) {
  64. try {
  65. this.stm = this.conn.createStatement();
  66. this.stm.executeUpdate("UPDATE Recordes SET score=\"" +
  67. String.valueOf(hiScore.getScore()) + "\"" +
  68. "WHERE jogo=\"" + hiScore.getJogo() + "\"");
  69. } catch (SQLException e) {
  70. e.printStackTrace();
  71. }
  72. }
  73. /**
  74. * Retorna um objeto Vector com todos os recordes do banco de dados
  75. * organizados em ordem decrescente de pontuação.
  76. * @return
  77. */
  78. public Vector getAll() {
  79. Vector hiScores = new Vector();
  80. try {
  81. rs = this.stm.executeQuery("SELECT * FROM Recordes " +
  82. "ORDER BY score DESC");
  83. while (rs.next()) {
  84. hiScores.add(new HiScore(rs.getString("jogo"), rs.getInt("score")));
  85. }
  86. rs.close();
  87. } catch (SQLException e) {
  88. e.printStackTrace();
  89. }
  90. return hiScores;
  91. }
  92. }
  93.  

Demo

Esta classe existe apenas para testar as operações de DBConnection. Ela insere três recordes, mostra o conteúdo do banco, altera uma linha, remove outra, e mostra novamente todos os recordes.

  1. import java.util.Iterator;
  2.  
  3. public class Demo {
  4. public static void main(String[] args) {
  5. try {
  6. DBConnection dbCon = new DBConnection("hiscores.db");
  7. dbCon.initDB();
  8. dbCon.addHiScore(new HiScore("Duck Tales", 800000));
  9. dbCon.addHiScore(new HiScore("Quackshot", 220000));
  10. dbCon.addHiScore(new HiScore("Metroid", 12345678));
  11. Demo.imprimeLista(dbCon);
  12. dbCon.atualizaHiScore(new HiScore("Quackshot", 99999999));
  13. dbCon.removeHiScore("Metroid");
  14. Demo.imprimeLista(dbCon);
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. public static void imprimeLista(DBConnection dbCon) {
  20. Iterator it = dbCon.getAll().iterator();
  21. HiScore hs;
  22. System.out.println("---------------------");
  23. while(it.hasNext()) {
  24. hs = (HiScore) it.next();
  25. System.out.println("Jogo.:" + hs.getJogo());
  26. System.out.println("Score:" + String.valueOf(hs.getScore()));
  27. System.out.println();
  28. }
  29. }
  30. }
  31.  

Eclipse

Vamos ao roteiro para criar um projeto no Eclipse e configurá-lo adequadamente para desfrutarmos do SQLite.

Abra o Eclipse e crie um novo projeto Java com o nome "SQLiteDemo". Copie os arquivos sqlitejdbc.jar e libsqlitejdbc.so (ou libsqlitejdbc.dll, ou ainda os dois se quiser ser multiplataforma) para o diretório do projeto, ou simplesmente arraste e solte os arquivos sobre o nome do projeto no Package Explorer do Eclipse.

Ainda no Package Explorer, clique com o botão direito sobre o nome do projeto, e no menu escolha "Properties".

Na janela de propriedades do projeto, escolha o item "Java Build Path" e em seguida a aba "Libraries". Clique no botão "Add JARs", procure a entrada com o nome "SQLiteDemo", e sob ela uma entrada "sqlitejdbc.jar". De volta à janela de propriedades do projeto, expanda a entrada "sqlitejdbc.jar", escolha "Native library location: (None)" e clique no botão "Edit...". Na janela "Native Library Folder Configuration" que irá surgir, clique no botão "Workspace", na lista apresentada escolha novamente "SQLiteDemo". Agora basta clicar em "OK" na janela de propriedades do projeto e começar a usar SQLite sabor Java.

Executando

Dentro do projeto, crie as classes mostradas anteriormente e execute a partir da classe Demo, a saída deve ser esta aqui:

---------------------
Jogo.:Metroid
Score:12345678

Jogo.:Duck Tales
Score:800000

Jogo.:Quackshot
Score:220000

---------------------
Jogo.:Quackshot
Score:99999999

Jogo.:Duck Tales
Score:800000

E Pra Acabar...

Imagem:Go-down.png

SQLiteDemo.zip

Ao lado está o download do projeto "SQLiteDemo", completo, com o driver SQLite e tudo mais. Para importá-lo no seu workspace do Eclipse, vá em File->Import, escolha Archive File e indique o arquivo com o código deste tutorial.

Outras Referências


Autor: Marcelo Lira

Imagem:Cc-small.png : Imagem:Cc-by.png Imagem:Cc-sa.png
Atribuição-Compatilhamento pela mesma licença 2.5

Ferramentas pessoais
Vistas